【old】Python学习笔记
上学期看视频记得,也没学到多少,目前打算一边通过《Python学习手册 第四版》提高核心语法(太厚了 噗),一边学习Python Web开发
然后这里的多任务编程和网络编程是暑假学的
5. 函数
5.1 函数的参数
### 可变对象按引用传递,不可变对象按引用传递# 避免对可变参数的修改:L = [1,2]change(L[:]) ## 或def change(l): l = l[:]###【默认参数】【必须是不可变对象】def power(x,n=2): return x**npower(2) #=>4power(2,3) #=>8###【可变参数】(元祖)def sum(*nums): #可以传入0到N个参数,函数内部接收到的是tuple s=0 for x in nums: s+=x return s###【关键字参数】(字典)def preson(name,age,**kw): #可以传入0个或多个参数 print('name:',name,'age:',age,'other',kw)person('bin',19,city='zz',job='stu') #=> name:bin age:19 other:{'city':'zz','job':'stu'}###【元祖字典的】【拆包】a=(1,2,3)def func(*args): print(args)func(a) # => ((1,2,3),) 没有*当作一个值,有*拆成N个值传入func(*a) # => (1,2,3) 【拆包,拆成一个一个的值】 字典 传入 **a
5.2 函数式编程
5.2.1 匿名函数
>>> func = lambda x : x*2 #分号前是参数,分号后是表达式,不用return,自动返回后面的值>>> func(2) #=> 4###【简单应用,字典排序,匿名函数作实参】info = [{'name':'bin','age':19},{'name':'jin','age':19},{'son':'sname','age':1}]info.sort(key=lambda x:x['name'])print(info)
5.2.2 高阶函数
就是函数名可以作为参数使用
### map(func,seq) 将函数func作用于序列seq的每个元素,并返回一个迭代器>>> list(map(lambda x:x*2,[1,2,3])) # => [2,4,6]### reduce(func,seq) 把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:###reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)>>> from functools import reduce>>> def fn(x, y):... return x * 10 + y...>>> reduce(fn, [1, 3, 5, 7, 9])13579###filter(func,seq) filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。def not_empty(s): #把列表的空字符串去掉 return s and s.strip()list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))# 结果: ['A', 'B', 'C']###sorted(seq,key=None,reverse=False)>>> sorted([36, 5, -12, 9, -21])[-21, -12, 5, 9, 36]#还可以接收一个key函数来实现自定义的排序,key作用于每一个元素,并按作用后的seq排序>>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
5.3 作用域
a=1def aa(): global a #如果没有global a的话,想要在函数中对a这个全局变量修改,仅仅a=0还不够,因为a是个与全局 a=0 #变量相同的局部变量,需要用 global a将他声明为全局变量,然后修改aa()print(a) # => 0##如果列表和字典当作全局变量时,可以不用global,直接在函数内部修改。因为列表字典是可变类型可以直接修改l=[1,2,3]def a(): l.append(4)a()print(l) #=> [1,2,3,4]###---------a=100def test(a): a+=a print(a) #=>200 没用global,函数外a不变#-----------a=[100]def test(b): #b引用a指向的对象,如果对象是可变类型,下面可以修改全局变量,否则的话,重新指向复制的新的对象 b+=b #=> 函数外:a => [100,100], b=b+b #=> [100]+[100]==>[100,100] 函数外:a => [100]。因为这里右侧新建了一个对象,b作为局部变量重新引用了一个新的对象。 #----对象名搜寻顺序----#locals -> enclosing function -> globals -> builtins#局部 闭包的外函数的局部变量 全局 内建
5.4 闭包
闭包就是内部函数引用了外部函数的临时变量,并且外部函数返回了内部函数的引用
def outer(x): def wrapper(y): print(x+y) return wrappera = outer(1)#a现在是wrapper指向函数的引用a(1)#2a(2)#3###【闭包无法修改外部函数的局部变量】def outer(): n = 1 def wrapper(): n -= 1 #error, n = 2 #相当于新定义了一个局部变量 n = 2 return wrapper##通过nonlocal修改外部函数局部变量def outer(): n = 1 #将n定义为列表也可以,解决这个问题 def wrapper(): nonlocal n n -= 1 print(n) return wrappera = outer()a()#输出0###闭包执行完成后,仍然能保持住当前的执行环境a()#输出-1a()#输出-2###【注意事项】# 当闭包内引用了一个后期会发生变化变量时# 1.def outer(): a = 1 def inner(): print(a) a = 2 return innera = outer()a()#输出了2,因为inner后又修改了## 2. def outer(): l = [] for i in range(1,4): def inner(): return i*i l.apend(inner) return lf1,f2,f3 = outer()print(f1(),f2(),f3())#9,9,9#原因就在于返回的函数引用了变量i,但返回的函数并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9#[解决:]def outer(): def f(j): def inner(): return j*j return inner fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行(是一个数值,而不是函数),因此i的当前值被传入f() return fs
5.5 装饰器
就是不修改原函数的情况下,添加新的功能
###【装饰器原理】def w1(func): def wrapper(): print('这是新加功能') func() return wrapperdef f1(): print('---f1---')f1 = w1(f1)f1() # 将会添加一个print### 【使用@】@w1 #在定义的函数面前使用 @包装函数。代码执行到这会立即执行函数w1。def f2(): print('---f2---')f2() #将会添加一个print###【添加多个装饰器】def w1(func): def wrapper(): print('w1') func() return wrapperdef w2(func): def wrapper(): print('w2') func() return wrapper@w2@w1 #这样就添加了两个新功能;先w1装饰,然后w2再装饰,即w2装饰的是w1装饰的结果def f(): print('test...')f()###【带有参数的函数的装饰器】def decorator(func): def wrapper(a,b): print('新功能') func(a,b) #这里和wrapper添加参数 return wrapper@decoratordef sum(a,b): print('sum ',a+b)sum(1,2)###【不定长参数的装饰器】def decorator(func): def wrapper(*args,**kwd): #这样就对没有参数、有n个参数,的函数都能使用了 print('新功能') func(*args,**kwd) #这里和wrapper添加参数 return wrapper@decoratordef sum(a,b): print('sum ',a+b) @decoratordef sum2(a,b,c): print('sum ',a+b+c)sum(1,2)sum2(1,2,3)###【装饰有返回值的函数】
转载于:https://www.cnblogs.com/yuanyb/p/9703875.html
【old】Python学习笔记相关推荐
- [python教程入门学习]python学习笔记(CMD执行文件并传入参数)
本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...
- python学习笔记之编写readConfig读写配置文件
python学习笔记之编写readConfig读写配置文件_weixin_34055910的博客-CSDN博客
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- Python学习笔记一简介及安装配置
Python学习笔记一 参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e54 ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
- Python学习笔记(二):标准流与重定向
Python学习笔记(二):标准流与重定向 - SamWei - 博客园 Python学习笔记(二):标准流与重定向 Posted on 2012-02-19 22:36 SamWei 阅读(176) ...
- python 学习笔记 12 -- 写一个脚本获取城市天气信息
近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...
- python基本语法语句-python学习笔记:基本语法
原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...
- 廖Python学习笔记一
1. 廖Python学习笔记 大的分类 如函数 用二级标题,下面的用三级 如输入输出 1.1.1. 输入输出 1.1.1.1. 输出 用 print() 在括号里加上字符串,就可以向屏幕上输出指定的文 ...
- Python学习笔记(六)
1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...
最新文章
- ListView的使用和数据绑定
- P2286 [HNOI2004]宠物收养场
- Prototype 框架分析(一)
- Android 开发 关于APP无法安装到Android模拟器上的问题
- 10 个优秀的JavaScript开发框架
- 自己编译nvm-window,解决无法修改镜像下载node很慢的问题!
- mysql 导出 客户端_Web基础配置篇(四): Mysql的配置及使用
- C#汉诺塔递归算法实现
- Bytom BIP-32协议和BIP-44协议
- 【转】京东商城思维导图
- noob学算法----冒泡(bubble)排序算法 Java
- html语言中alt,html中alt的用法
- webpack 5高级配置优化
- 多WLAN口路由器原理分析
- jsch jar包连接不上ssh报Algorithm negotiation fail 错误
- Java零基础学习全套视频笔记
- 从优步僵尸车事件看源码保护的必要性
- 如何知道该不该接受创业公司的工作?
- 女友要一个人去厦门旅游
- bzoj 1143: [CTSC2008]祭祀river
热门文章
- C语言之字符串探究(九):空格去除——trim系列
- java vm art_Android虚拟机art流程:JavaVM 和 JNIEnv 的初始化 - 神农笔记
- 网络驱动器映射成功但无法更新文件_我的电脑访问NAS像打开本地硬盘那样打开网络NAS...
- ads s参数拟合_数据分析--拟合
- 无法加载_Microsoft store应用商店无法加载 问题解决
- bat脚本交互输入_windows 10 如何设定计划任务自动执行 python 脚本?
- verdi中波形怎么看间距_小间距led显示屏金线封装真伪怎么看?
- SpringBoot POM web开发(spring-boot-starter-web)
- pytorch GPU
- 19 Signals and Signal Handling