函数
函数声明使用def关键字,返回时使用return关键字
def my_function(x, y, z=2): if z>1: return z * (x+y) else: return z/(x+y) #调用函数时,x和y时位置参数,z是关键字参数 my_function(5,6,z=2) my_function(10,20)
命名空间,作用域和本地函数
在函数内部,任意变量都是默认分配到本地命名空间的。本地命名空间实在函数被调用时生成的,执行结束后,命名空间就会销毁。如
def func(): a = [] for i in range(5): a.append(i)
返回多个值
def c(): a = 1 b = 2 c = 3 return a, b, c a, b, c = f() #return_value = f() 此时是一个包含3个元素的元组
函数是对象
import re #正则表达式模块 def clean_strings(): result = [] for value in strings: value = value.strip()#删除字符串首尾指定的字符,默认为空格或换行 value = re.sub('[!#?]','',value)#将匹配到的字符用指定字符替换 value = value.title() result.append(value) return result
匿名函数
匿名函数是一种通过单个语句生成函数的方式,匿名函数使用lambda关键字定义。
def short_function(x): return x * 2 #上方等同于下面所示 equiv_anon = lambda x: x * 2
柯里化:部分参数应用
柯里化表示通过部分参数应用的方式从已有的函数中衍生出新的的函数。
例如有这么一个函数:
def add_numbers(x, y): return x + y
使用这个函数我们可以衍生出一个变量的新函数。
add_five = lambda y: add_numnbers(5, y)
或者模块的函数简化
from functools import partial add_five = partial(add_numbers, 5)
生成器
1.在Python中,一边循环一边计算的机制,称为生成器,生成器保存的是算法
如需创建一个生成器,只需将关键字return替换为yield关键字
def squares(n=10): for i in range(1,n+1): yield i ** 2 gen = squares() print(gen) #实际调用时,代码不会立即执行: #知道你请求生成器中的元素时。才会执行它的代码 for x in gen: print(x, end = ' ') 输出为: <generator object squares at 0x000002219AEE7E08> 1 4 9 16 25 36 49 64 81 100
2.用生成器表达式来创建更为简单。
gen = (x ** 2 for x in range(100)) #等同于下面更为复杂的生成器 def f(): for x in range(100): yield x ** 2 gen = f()
3.用itertools模块
标准库中的itertools模块时适用于大多数数据算法的生成器集合。
groupby可以根据任意的序列和一个函数,通过函数得返回值对序列值中中连续得元素进行分组。
import itertools first_letter = lambda x:x[0] names = ['Alan','Adam','Wes','Will','Albert','Steven'] for letter,name in itertools.groupby(names,first_letter): print(letter,list(names)) 输出: A ['Alan', 'Adam'] W ['Wes', 'Will'] A ['Albert'] S ['Steven']
错误和异常处理
f = opne(path,'w') try: #是否报错 write_to_file(f) except: #报错实现 print('Failed') else: #没报错实现 print("succeeded") finally: #是否报错都要实现 f.close()