小说网站开发 小说网站源码,做ic哪些网站好做,做网站需要的设备,360关键词排名推广一#xff0c;推导式
定义#xff1a;用一句简洁的语句#xff0c;从迭代对象中#xff0c;生成新列表的语法结构#xff08;对for循环append#xff08;)的一种简写形式#xff09;语法#xff1a;[表达式 for 变量 in 可迭代对象]1.列表推导式
这是for循环appe…一推导式定义用一句简洁的语句从迭代对象中生成新列表的语法结构对for循环append)的一种简写形式语法[表达式 for 变量 in 可迭代对象]1.列表推导式这是for循环append num[1,2,3,4,5]res[]foriinnum:res.append(i*2)print(res)推导式 num[1,2,3,4,5]res[n*2forninnum]print(res)带条件的推导式 num[1,2,3,4,5]res[n*2forninnumifn2]print(res)2.字典推导式name[张大,张二,张三]score[70,6,80]res{name[i]:score[i]foriinrange(len(name))}#取下标用下标一一对应print(res)3.集合推导式name[张大,张二,张三]res{i?foriinname}print(res)没有元组推导式生成器二内置函数1.输入与输出print() 输出指定内容完整参数print(*objects, sep’ ‘, end’\n’,filesys.stdout, flushFalse)参数详解1.objects要输出的内容2.sep分隔符3.end结束符4.file输出位置5.flush是否立即刷新importtimeforindexinrange(1,101):print(f\r已加载{index}%,end,flushTrue)time.sleep(0.1)一个加载input() 获取用户输入2.类型转换int() 转为整数float() 转为浮点数str()转为字符串bool() 转为布尔值list() 转为列表tuple() 转为元组set() 转为集合dict() 转为字典3.数学相关abs() 取绝对值print(abs(-9))print(abs(-2.5))print(abs(3-5))#正负都可以round() 四舍五入注意round函数的四舍五入是银行家舍入法小于5就舍大于5就入等于5看奇偶奇入偶舍pow() 次方#正负都可以 print(pow(2, 3)) # 2的3次方 print(pow(2, -1)) # 2的-1次方 print(pow(2, 0.5)) # 2的开平方 print(pow(2, 3, 5)) # 2的3次方对5取模divmod() 商和余数print(divmod(10,3))#结果为31max() 最大值支持 key 函数min() 最小值支持 key 函数sum() 求和map() 加工一组数据filter() 按条件过滤数据支持 key 函数reduce() 合并计算需导入 functoolssorted() 排序支持 key 函数4.数据容器相关len() 获取容器中元素的个数range() 生成一个数字序列可用于循环forindexinrange(0,10,2):#2相当于步长print(index)enumerate() 给序列添加索引zip() 将多个序列一一配对以少的为准你可以少写names(张三,李四,王五)scores[60,70,80]reszip(names,scores)print(list(res))5.类型判断与对象相关type() 查看类型isinstance()判断类型issubclass() 判断两个类的继承关系id()查看对象的内存地址六、逻辑判断相关all() 全为真返回True any() 有一个为真即可any() 有一个为真即可l[0,,None,False,1]print(any(l))7.字符串辅助相关ord() 获取字符的 Unicode 编码值chr() 将 Unicode 编码值转为字符三拷贝1.浅拷贝定义创建一个新的外层容器但是内部元素仍然引用原来的对象注意嵌套数据仍然共享修改嵌套数据会相互影响importcopy#需要加代码块num[1,2,3,4,5,[1,2,3]]numscopy.copy(num)nums[5][1]10print(nums)print(num)2.深拷贝定义创建一个新的外层容器并对其内部所有的可变对象进行递归复制注意1.深拷贝只复制可变对象不可变对象直接引用2.元组中如果只包含不可变对象则深拷贝无效importcopy num[1,2,3,4,5,[1,2,3]]numscopy.deepcopy(num)nums[5][1]10print(nums)print(num)四四种作用域查找顺序是局部作用域外层作用域全局作用域内建作用域1.局部作用域local定义函数内部是局部作用域局部作用域中的变量只能在函数内部可见 特点1.每次调用函数都会创建一个新的局部作用域2.函数运行结束后局部作用域之后就会销毁3.局部作用域优先级最高2.外层作用域(encolosing)定义:如果函数中又定义了图数那么外展的数的作用域就是内层函数的 Enclosing 作用域 特点:1.只有当函数嵌套定义”时才会出现。2.内层函数可以读取外层函数交量。3.想修改外层变量必须使用nonlocal3.全局作用域(global)定义:.py 文件就是全局作用域全局作用城中的变量在当前.py文件的任何位置都可以访问. 特点:1.全局变量只在当前.py 文件中可见。2.函数内部可以使用global关键字作改全受量4.内建作用域(built-in)定义:Python 预先定义好的东西会放在内建作用域中所有.py文件都可以直接使用特点:1.所有 .py文件都能直接使用其中的名称2.例子print len range3.查找此先级册低(LEGB的Ba100#全局作用域deftest(b):print(我是test函数)#外层函数作用域print(test中打印的a是,a)print(test收到的参数b是,b)c200d300print(test中的c和d是,c,d)definner():#局部作用域e400nonlocalc c999print(inner中的e是,e)print(inner中打印的c是,c)print(###,a)inner()print(,c)print(全局打印的a是,a)test(66)五闭包定义闭包内层函数被内层函数所引用的外层变量产生条件1.有函数嵌套2.在内层函数中要访问外层函数的变量没有用到的就会被销毁3.并且外层函数要返回内层函数这样才不会在局部变量中被销毁defouter():num10definner():nonlocalnum num1print(num)returninner fouter()f()f()f()结论1.outer函数中被inner所使用到的那些变量会被封存到闭包单元(cell)中。2.这些 cell 会组成一个closure元组最终放在了 inner 函数身上。注意1.调用n次外层函数就会得到n个不同的闭包并且这些闭包之间互不影响2.内层函数中用到的外层变量是可变对象多个闭包之间依然互不影响优点可以“记住”状态不用全局变量也不用写类就能在多次调用之间保存数据。可以做“配置过的函数”先传一部分参数把环境固定住得到一个定制版函数。可以实现简单的“数据隐藏”外层变量对外不可见只能通过内层函数访问。是装饰器decorator等高级用法的基础。defbeauty(char,n):defshow_msg(msg):print(char*nmsgchar*n)returnshow_msg show1beauty(*,2)show1(你好)show1(直立千古)show2beauty(,2)show2(你好)show2(水宕骑虎)缺点理解成本较高对初学者不太友好滥用会让代码难读。如果闭包里引用了很大的对象又长期不释放可能会增加内存占用。很多场景下其实用【类 实例属性】会更清晰闭包不一定是最优解。六装饰器1. 函数装饰器定义1.装饰器是一种【可调用对象】通常是函数它能接收一个函数作为参数并且会返回一个新函数。2.装饰器可以在不修改原函数代码的前提下增强或改变原函数的功能。实际应用在不改变原函数的前提下给函数统一加上日志、计时、校验、缓存 等功能关键点1.接收被装饰的函数、同时返回新函数wrapper2.装饰器“吐出来”的是 wrapper 函数以后别人调用的也是 wrapper 函数。3.为了保证参数的兼容性wrapper 函数要通过 *args 和 **kwargs 接收参数。4.wrapper 函数中主要做的是调用原函数被装饰的函数、执行其它逻辑但要记得将原函数的返回值 return 出去。手动装饰defsay(func):defwrapper(*args,**kwargs):print(你好我要开始计算了)returnfunc(*args,**kwargs)returnwrapperdefadd(x,y,z):resxyzprint(f{x}和{y}和{z}相加的结果是{res})returnres addsay(add)resultadd(10,20,30)print(result)使用装饰器defsay(func):defwrapper(*args,**kwargs):print(你好我要开始计算了)returnfunc(*args,**kwargs)returnwrapper#saydefadd(x,y,z):resxyzprint(f{x}和{y}和{z}相加的结果是{res})returnres# 正常调用add函数resultadd(10,20,30)print(result)带参数的装饰器(三层嵌套外层接收配置、中间层接收函数、内层接收具体参数)defsay(msg):defouter(func):defwrapper(*args,**kwargs):print(f你好我要开始{msg}计算了)returnfunc(*args,**kwargs)returnwrapperreturnoutersay(加法)defadd(x,y,z):resxyzprint(f{x}和{y}和{z}相加的结果是{res})returnressay(减法)defsub(x,y):resx-yprint(f{x}和{y}相减的结果是{res})returnres result1add(10,20,30)print(result1)result2sub(20,10)print(result2)多个装饰器一起使用deftest1(func):print(我是test1装饰器)defwrapper(*args,**kwargs):resfunc(*args,**kwargs)print(test1追加的逻辑)returnresreturnwrapperdeftest2(func):print(我是test2装饰器)defwrapper(*args,**kwargs):resfunc(*args,**kwargs)print(test2追加的逻辑)returnresreturnwrappertest1test2defadd(x,y):resxyprint(f{x}和{y}相加的结果是{res})returnres resultadd(10,20)这个输出结果相当于add test1(test2(add))从外向内后面因为先运行的res func(*args, **kwargs)所以他会加在add函数输出结果的下面因为后进先出所以add结果先出来了2.类装饰器1.包含call方法的类就是类装饰器。2.像调用函数一样去调用类装饰器的实例对象就会触发call方法的调用。3.call方法通常接收一个函数作为参数并且会返回一个新函数。classSay:def__call__(self,func):defwrapper(*args,**kwargs):print(开始计算了)returnfunc(*args,**kwargs)returnwrapper#使用语法使用类装饰器Say()defadd(x,y):resxyprint(f{x}和{y}相加的结果是{res})returnres resultadd(10,20)print(result)带参数的类装饰器classSay:def__init__(self,msg):self.msgmsgdef__call__(self,func):defwrapper(*args,**kwargs):print(f开始{self.msg}计算了)returnfunc(*args,**kwargs)returnwrapperSay(加法)defadd(x,y):resxyprint(f{x}和{y}相加的结果是{res})returnres resultadd(10,20)print(result)多个类装饰器的使用classTest1:def__call__(self,func):defwrapper(*args,**kwargs):print(我是Test1的逻辑)returnfunc(*args,**kwargs)returnwrapperclassTest2:def__call__(self,func):defwrapper(*args,**kwargs):print(我是Test2的逻辑)returnfunc(*args,**kwargs)returnwrapperTest1()Test2()defadd(x,y):resxyprint(f{x}和{y}相加的结果是{res})returnres resultadd(10,20)print(result)