1. 函数的定义
def func1(): # 带返回值的函数 print('xiaojingzi') return 0 def func2(): # 没有返回值的函数 print('xiaojunzi') func1() # 调用函数
2. 函数的参数
2.1 形参与实参
def fun(a, b) # a, b 是形参 print(a + b) fun(2, 3) # 2, 3是实参
2.2 默认参数
def person(name, age, country='China'): print(name) print(age) print(country) 默认参数参数可以输入,也可以不输入,一般而言默认参数放在最后 person('xiaojingzi', 20) person('xiaojunzi', 30, 'USA')
2.3 关键参数
def person(name, age): print(name) print(age) person('xiaojingzi', 30) person(age=10, name='xiaojingzi') # 位置参数调用,形参一一对应,关键参数调用,不需要一一对应,
2.4 非固定参数
当不确定需要传入几个参数时,可以采用非固定参数
def test(*args): # 接收n个位置参数,转换成元组形式 print(args[1]) # 两种调用形式 test(*[1, 2, 3, 4]) test(1, 2, 3, 4, 5) def tes(**kargs): # n个关键字,转换成字典的格式 print(kargs) print(kargs['name']) print(kargs['xiao']) tes(name='alex', age='8', sex='nv', xiao='xiaojingzi') tes(**{'name': 'alex', 'xiao': 'xkaojunzi'}) # 两种调用形式
2.5 函数的变量
def change_name(): name[0] = 'xiaojingzi' print('inside func', name) # 列表,字典,集合,类可以在函数中修改,整数,字符串不可以在函数中修改
3. 递归函数
def calc(n): if n < 10: pass else: print(n/2) return calc(n/2) calc(50) # 递归:1. 必须有一个明确的结束条件 #2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 #3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
4. 匿名函数
插入map()函数的用法:
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
#1、当seq只有一个时,将函数func作用于这个seq的每个元素上,并得到一个新的seq。 def f(x): return x*x print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) # 输出结果: [1, 4, 9, 10, 25, 36, 49, 64, 81] # 2. 当seq多于一个时,map可以并行(注意是并行)地对每个seq执行如下图所示的过程: # python3中可以处理类表长度不一致的情况,但无法处理类型不一致的情况, l4=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2]) for i in l4: print(i) #(1, 2) (4, 4) l4=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2,'a']) # 报错 for i in l4: print(i)
匿名函数的使用
res = map(lambda x:x**2,[1,5,7,4,8]) for i in res: print(i)
5. 高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def add(x,y,f): return f(x) + f(y) res = add(3,-6,abs) print(res)
6. 内置函数
内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii
#compile f = open("函数递归.py") data =compile(f.read(),'','exec') exec(data) #print msg = "又回到最初的起点" f = open("tofile","w") print(msg,"记忆中你青涩的脸",sep="|",end="",file=f) # #slice # a = range(20) # pattern = slice(3,8,2) # for i in a[pattern]: #等于a[3:8:2] # print(i) # # #memoryview #usage: #>>> memoryview(b'abcd') #<memory at 0x104069648> #在进行切片并赋值数据时,不需要重新copy原列表数据,可以直接映射原数据内存, import time for n in (100000, 200000, 300000, 400000): data = b'x'*n start = time.time() b = data while b: b = b[1:] print('bytes', n, time.time()-start) for n in (100000, 200000, 300000, 400000): data = b'x'*n start = time.time() b = memoryview(data) while b: b = b[1:] print('memoryview', n, time.time()-start) 几个内置方法用法提醒