第16章--函数基础
函数定义:
def <name>(arg1,arg2,……)
<statement>
第17章--作用域
函数定义了本地作用域
模块定义了全局作用域
每次函数的调用都创造了一个新的本地作用域
变量查找:
本地作用域->上层函数作用域->全局作用域->内置作用域
内置作用域 import builtins builtins.zip()可以屏蔽本地的重载
global 在复制或是引用时
不同文件间通信最好通过函数调用,最小化文件间变量的修改
工厂函数 记住嵌套做作用域的变量值,及时上层函数不在了
lambda +参数:行为 表达式函数
带循环变量的函数,只能记住最后一次嵌套值 exa:P432
此时必须把参数作为值传递给lambda
nonlocal 修改的嵌套函数本地作用域中的x
nonlocal x x必须在上层嵌套函数中存在,否则会抛出异常
P400页程序的第3,4行都应加'/t'
第18章--参数
不可变参数通过"值"进行传递
可变对象是通过"指针"进行传递
限定可变对象
1.赋值复制 def f(L[:])
2.利用元组 def f(tuple(L))
返回值可以有多个值,实际是一个元组
def func(*name) 匹配元组参数
def func(**name) 匹配字典参数
def func(*args, name)
混合参数,顺序出现
调用函数:参数,关键字参数和*sequence的组合, **dict,keyword-only可在*seq之前或之后,可在**dict中
函数头:参数,默认参数,*name,name/name=value keyword-only, **name
关键字参数可以改变默认顺序
例:def func(a,b,c,d):print(a,b,c,d)
func(*(1,2),**{'d':2,'c':1})>>>1 2 1 2
func(1, *(2, 3), d=4)>>>1 2 3 4
3.0废弃了2.6的apply
定义时出现在*name后面的name/name=value 为keyword-only,未被赋值会产生错误
keyword也可以通过**arg, arg.pop('sep'.' ')
第19章--函数高级话题
递归
def mysum(L):
return 0 if not L else L[0]+mysum(L[1:])
递归的好处:处理任意嵌套结构,example:[1,2,[3,4,[5]]]
temp=mysum;print(temp([1,2,3,4]))>>>10
可以给函数添加任意属性 mysum.count = 0
注解:不影响函数,只是起到注释的作用。
def func(a:'haha'= 4)->int: int是返回值的注解
return b
func.__annotations__会显示注解(字典形式)
注解在lambda中无效
匿名函数,lambda:表达式,非语句
lambda arg1,arg2,……:表达式
f = (lambda a,b,c:c+b+a);f(1,2,3)>>>6
lambda提供函数速写的功能,可以写在元组或是字典中
lambda可以通过列表和map嵌入循环->晦涩难懂
map:在寻列中映射函数
l=[1,2] list(map(lambda x:x+3, l))=[4, 5]
可以映射多参数函数 list(map(pow,[1,2],[3,4]))>>>[1,16]
filter:测试函数,过滤出一些元素 list(filter((lambda x:x>3), range(5)))>>>[4]
from functools import reduce
每一步,reduce传递当前结果和下一个元素给函数
reduce((lambda x,y:x+y),[1,2,3,4])>>>10
函数定义:
def <name>(arg1,arg2,……)
<statement>
第17章--作用域
函数定义了本地作用域
模块定义了全局作用域
每次函数的调用都创造了一个新的本地作用域
变量查找:
本地作用域->上层函数作用域->全局作用域->内置作用域
内置作用域 import builtins builtins.zip()可以屏蔽本地的重载
global 在复制或是引用时
不同文件间通信最好通过函数调用,最小化文件间变量的修改
工厂函数 记住嵌套做作用域的变量值,及时上层函数不在了
lambda +参数:行为 表达式函数
带循环变量的函数,只能记住最后一次嵌套值 exa:P432
此时必须把参数作为值传递给lambda
nonlocal 修改的嵌套函数本地作用域中的x
nonlocal x x必须在上层嵌套函数中存在,否则会抛出异常
P400页程序的第3,4行都应加'/t'
第18章--参数
不可变参数通过"值"进行传递
可变对象是通过"指针"进行传递
限定可变对象
1.赋值复制 def f(L[:])
2.利用元组 def f(tuple(L))
返回值可以有多个值,实际是一个元组
def func(*name) 匹配元组参数
def func(**name) 匹配字典参数
def func(*args, name)
混合参数,顺序出现
调用函数:参数,关键字参数和*sequence的组合, **dict,keyword-only可在*seq之前或之后,可在**dict中
函数头:参数,默认参数,*name,name/name=value keyword-only, **name
关键字参数可以改变默认顺序
例:def func(a,b,c,d):print(a,b,c,d)
func(*(1,2),**{'d':2,'c':1})>>>1 2 1 2
func(1, *(2, 3), d=4)>>>1 2 3 4
3.0废弃了2.6的apply
定义时出现在*name后面的name/name=value 为keyword-only,未被赋值会产生错误
keyword也可以通过**arg, arg.pop('sep'.' ')
第19章--函数高级话题
递归
def mysum(L):
return 0 if not L else L[0]+mysum(L[1:])
递归的好处:处理任意嵌套结构,example:[1,2,[3,4,[5]]]
temp=mysum;print(temp([1,2,3,4]))>>>10
可以给函数添加任意属性 mysum.count = 0
注解:不影响函数,只是起到注释的作用。
def func(a:'haha'= 4)->int: int是返回值的注解
return b
func.__annotations__会显示注解(字典形式)
注解在lambda中无效
匿名函数,lambda:表达式,非语句
lambda arg1,arg2,……:表达式
f = (lambda a,b,c:c+b+a);f(1,2,3)>>>6
lambda提供函数速写的功能,可以写在元组或是字典中
lambda可以通过列表和map嵌入循环->晦涩难懂
map:在寻列中映射函数
l=[1,2] list(map(lambda x:x+3, l))=[4, 5]
可以映射多参数函数 list(map(pow,[1,2],[3,4]))>>>[1,16]
filter:测试函数,过滤出一些元素 list(filter((lambda x:x>3), range(5)))>>>[4]
from functools import reduce
每一步,reduce传递当前结果和下一个元素给函数
reduce((lambda x,y:x+y),[1,2,3,4])>>>10