当前位置: 首页 > news >正文

湖州网站建设服务第一站商城

湖州网站建设服务,第一站商城,办公室装修风格图,营销设计网站建设你好#xff0c;我是kelly。 kelly根据自己平时工作#xff0c;总结9个易错知识点#xff0c;希望对大家有用。 知识点1#xff1a;is 和 is比较是两个变量地址是否相同#xff0c;比较是两个变量的值#xff08;内容#xff09;是否相同。 示例#xff1a; In [92…你好我是kelly。 kelly根据自己平时工作总结9个易错知识点希望对大家有用。 知识点1is 和 is比较是两个变量地址是否相同比较是两个变量的值内容是否相同。 示例 In [92]: a [1, 2, 3] In [93]: b [1, 2, 3]In [94]: id(a) Out[94]: 2799999236992In [95]: id(b) Out[95]: 2799997311872In [98]: a is b Out[98]: FalseIn [96]: a b Out[96]: True a和b的内容相同用id()函数可以查看变量地址a和b的地址不同。 对上述例子做调整 In [99]: a [1, 2, 3] In [100]: b aIn [101]: id(a) Out[101]: 2799998170496In [102]: id(b) Out[102]: 2799998170496In [103]: a is b Out[103]: TrueIn [105]: a b Out[105]: True 将一个变量赋值给另一个变量本质上是起了另一个别名前后2个变量指向同一个内存地址地址和内容都相同。 知识点2{}、{1,2,3}、set()的区分 {}创建的是空dic{1,2,3}创建的是set空set使用set()创建 示例 In [39]: type({}) Out[39]: dictIn [40]: type({1,2,3}) Out[40]: setIn [41]: set() Out[41]: set()In [42]: dict() Out[42]: {} 使用{1,2,3}初始化集合set是一个特殊写法注意和{}创建空字典dict做区别。 知识点3函数参数的默认值使用可变数据类型 默认参数值只会在函数被执行时被赋值一次参数默认值在内存始终存在直至程序运行结束。 使用可变数据类型作为函数参数默认值该参数值“可能”会在函数运行过程不断发生变化。 示例 def add_sequence(value, lst[]):lst.append(value)return lstIn [57]: add_sequence(100) Out[57]: [100]In [58]: add_sequence(101) Out[58]: [100, 101]In [59]: add_sequence(102) Out[59]: [100, 101, 102] 函数参数lst使用可变数据类型list作为默认参数多次运行函数每次的参数lst值都不同。当程序逻辑复杂时会引发各种bug。 建议不要使用列表作为函数参数的默认值再看另外一个示例 In [66]: def cal_sum(summation[]):...: summation.append(1)...: return summationIn [67]: cal_sum() Out[67]: [1]In [68]: cal_sum() Out[68]: [1, 1]In [69]: cal_sum() Out[69]: [1, 1, 1] 再次强调默认参数值只会在函数定义被执行时被赋值一次。 知识点4深拷贝、浅拷贝 在Python中对象赋值实际是对象引用前后两个变量所指向的是同一个地址内存空间。 变量赋值基础变量A赋值给变量B只是将变量A的引用给了变量B并没有将变量A的值真正给变量B。 深、浅拷贝在复杂变量list、dict或者list、dict相关的各种嵌套赋值时会发生问题。 浅拷贝 示例 In [70]: a [100, 101]...: b a...: a[0] 200In [71]: a Out[71]: [200, 101]In [72]: b Out[72]: [200, 101] 变量a改变了b也同步变化。 看下a和b的内存地址 In [73]: id(a) Out[73]: 2799976453696In [74]: id(b) Out[74]: 2799976453696 显然a和b指向同个内存地址。 深拷贝 如果想要新变量的值不受赋值前的原变量的影响需要对原变量执行深拷贝这样可以创建一个完全新的变量新变量会对原变量内部的对象进行级联拷贝。 深拷贝操作需要导入copy模块 示例 In [75]: import copy...: a [100, 101]...: b copy.deepcopy(a)...: b[0] 200In [76]: a Out[76]: [100, 101]In [77]: b Out[77]: [200, 101]In [78]: id(a) Out[78]: 2799987225600In [79]: id(b) Out[79]: 2799987318464 对变量a进行深拷贝deepcopy得到变量b变量a和b任一一方的改动不会影响到另一方。 知识点5f(x)与f(*x)调用 f(x)直接将变量实参x赋值给函数f的指定形参。 f(*x)x一般为序列调用时会按照函数f的参数顺序将序列x元素依次赋值给函数f的各个参数。 示例 def f1(x):print(f1:, x)def f2(x1, x2, x3):print(f2:, x1, x2, x3)f1(100) f2(*(100, 101, 102)) 输出结果 f1: 100 f2: 100 101 102 说明f(*x)调用时序列x的元素个数必须和函数f的形参数目一致。 def f2(x1, x2, x3, x4):print(f2:, x1, x2, x3)f2(*(100, 101, 102)) 抛出异常 TypeError: f2() missing 1 required positional argument: x4 知识点6*args 和 **kwargs *args接受序列作为输入 **kwargs接受字典作为输入 在很多情况下定义函数时无法确定真正调用时所传入参数的数目。对于这种情况可变参数的机制允许函数调用时接受可变数量的参数。 在函数定义中*args表示可以接受任意数量的位置参数使用时将传入的位置参数打包成一个元组赋值给args。 **kwargs表示可以接受任意数量的关键字参数使用时将传入的关键字参数打包成一个字典赋值给kwargs。 示例 In [62]: def show_func1(*args):...: return argsIn [63]: show_func1(张三, 李四, 王五) Out[63]: (张三, 李四, 王五)In [64]: def show_func2(**kwargs):...: return kwargsIn [65]: show_func2(name张三, sex男, age31) Out[65]: {name: 张三, sex: 男, age: 31} 知识点7可迭代对象、迭代器、生成器 可迭代对象 实现了__iter__()方法的对象可以通过调用iter()函数返回一个迭代器对象。 可迭代对象可以是Python内置的容器对象如列表、元组、集合、字典等也可以是自定义的对象。 自定义的可迭代对象示例 class CustomIterableObject(object):def __init__(self):self.name [张三, 李四, 王五]def __iter__(self):pass 什么都不做仅仅实现了__iter__方法。 Python内置的可迭代对象示例 In [80]: a [100, 101, 102, 103]In [81]: hasattr(a, __iter__) Out[81]: TrueIn [82]: hasattr(a, __next__) Out[82]: False 上述列表a是一个可迭代对象但没有实现__next__方法不是一个迭代器。 迭代器 Python中实现迭代协议的对象称为迭代器本质上是一种数据结构。需要实现__next__()和__iter__()等方法。__iter__()返回迭代器自身__next__()返回序列的下一个元素。 在每次迭代时迭代器都会产生一个值直到遍历完所有值。 可迭代对象和迭代器的区别可迭代对象不是迭代器可迭代对象可以通过iter()函数返回一个迭代器。 需要说明的是可迭代对象不一定能被迭代但迭代器一定是可迭代对象。 示例 In [83]: a2 iter(a)In [86]: a2 Out[86]: list_iterator at 0x28bebd10880In [84]: hasattr(a2, __iter__) Out[84]: True In [85]: hasattr(a2, __next__) Out[85]: True 使用iter()函数得到一个迭代器a2a2同时实现了__iter__()和__next__()两个方法。 生成器 是一种特殊类型的迭代器它使用函数和yield关键字定义可以像普通函数一样调用和执行。生成器在每次迭代时产生一个值并在下一次迭代时恢复执行。 第一次调用生成器生成函数后会返回一个生成器对象可以在挂起和恢复状态中切换。生成器不会一次性生成整个序列仅在每次调用时生成一个元素。生成器在内存使用和效率上更加优化特别适合大型数据处理。 生成器和迭代器的区别 1、实现方式不同生成器用yield语句实现创建迭代器需要实现__iter__()和__next__()方法。 2、生成数据方式不同对于一个序列生成器逐个生成元素迭代器一次性生成整个序列并存放在内存中。 3、执行方式不同生成器使用函数方式调用每次迭代时涉及到函数挂起和恢复迭代器按照序列顺序对各个元素依次执行。 知识点8return、yield关键字 return是完全终止函数并返回值。 yield是临时从函数内部返回值得到生成器。 示例 def get_return_value():for v in range(100, 105):return vdef get_yield_value():for v in range(100, 103):yield vIn [53]: value_yield get_yield_value()...: for value in value_yield:...: print(value) 100 101 102 知识点9函数使用没有定义的全局变量 函数只执行读操作时会直接使用全局变量的值。 函数执行写操作时会报错提示局部变量未定义。 示例 读取全局变量 SUMMATION 100def cal_sum1(a):print(SUMMATION)cal_sum1(10) 写全局变量 SUMMATION 100def cal_sum2(a):SUMMATION aprint(SUMMATION)cal_sum2(10) 抛出错误 UnboundLocalError: local variable SUMMATION referenced before assignment 如何修改全局变量使用global关键字 SUMMATION 100def cal_sum2(a):global SUMMATIONSUMMATION aprint(SUMMATION)cal_sum2(10) 本文原始版本发表链接 https://mp.weixin.qq.com/s?__bizMzI2Mjg3NTY5MQmid2247484561idx1snb4b6213f8f9b2ca4a21b68ab8a02b4dechksmea453bd5dd32b2c3aedc2058eebbad0204e0675b0642687234082bd8820483bed3e02e2cfbb6#rd kelly会在公众号「kelly学技术」不定期更新文章感兴趣的朋友可以关注一下期待与您交流。 --over--
http://www.pierceye.com/news/716210/

相关文章:

  • 网站用html做的怎么弄后台中铁十六局个人门户网
  • 一个网站怎么做流量统计佛山市seo广告优化工具
  • 机关网站建设需求文档国家住建部官网
  • 一条龙网站建设哪家好六安招聘网官网
  • 网站建设 中企动力阀门和建设银行类似的网站
  • 所有做运动的网站姜堰网网站
  • 广西汽车网网站建设影楼微网站建设方案
  • 企业展厅设计比较好的公司北京优化服务
  • 网站的icp 备案信息wordpress爆破字典
  • 福建厦门网站建设公司网站代码素材建设
  • 广州网络公司建站e语言可以做网站吗
  • 不想用原来的网站模板了就用小偷工具采集了一个可是怎么替换seo顾问张智伟
  • 效果好的徐州网站开发建设网站怎么学
  • 上海网站设计要多少钱建设银行个人网站打不开
  • 哪个网站做欧洲旅行比较好东营网站制作
  • 做pc端网站效果wordpress js 添加图片
  • 给装修公司做网站商标设计大全
  • 深圳做网站公司有哪些地方国际形势最新消息
  • 企业网站建设管理平台石家庄平山网站推广优化
  • 免费asp网站模板带后台网站建设需求调研通知
  • 浙江二建建设集团有限公司网站微信哪里可以做视频网站
  • wordpress阿里百秀5.2广州网站排名专业乐云seo
  • 网站建设 上海网站福州最好的网站建设公司
  • 兴力网站建设企业宣传网站在哪里做
  • 网站了建设pc官网 和手机网站
  • wordpress导航网站模板下载wordpress 关闭搜索引擎
  • 网站架构的优化wordpress企业主题免费下载
  • 分类信息网站手机版自学编程从哪学起
  • 网站目录 index.html京伦科技网站做的怎么样
  • 学做简单网站视频教程济源建设网站