Python之路【第五篇】python基础 之函数
函数
一、定义和使用
函数式编程最重要的是增强代码的重用性和可读性
1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值
函数的定义主要有如下要点:
- def:表示函数的关键字
- 函数名:函数的名称,日后根据函数名调用函数
- 函数体:函数中进行一系列的逻辑计算
- 参数:为函数体提供数据
- 返回值:当函数执行完毕后,可以给调用者返回数据
1、返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
以上要点中,比较重要有参数和返回值: 1 def 发送短信():
1 def 发送邮件(): 2 3 发送邮件的代码... 4 5 if 发送成功: 6 return True 7 else: 8 return False 9 10 11 while True: 12 13 # 每次执行发送邮件函数,都会将返回值自动赋值给result 14 # 之后,可以根据result来写日志,或重发等操作 15 16 result = 发送邮件() 17 if result == False: 18 记录日志,邮件发送失败...
2、参数
- 1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
- 2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
函数的有三中不同的参数:
- 普通参数
- 默认参数
- 动态参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #定义函数 2 #n 叫做函数 name 的形式参数,简称:形参 3 4 def name(n): 5 print(n) 6 7 #执行函数 8 #'nick' 叫做函数 name 的实际参数,简称:实参 9 10 name('nick') 11 12 普通参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def func(name, age = 18): 2 print("%s:%s")%(name,age) 3 4 # 指定参数 5 func('nick', 19) 6 # 使用默认参数 7 func('nick') 8 9 注:默认参数需要放在参数列表最后 10 11 默认参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def func(*args): 2 print args 3 4 # 执行方式一 5 func(11,22,33,55,66) 6 7 # 执行方式二 8 li = [11,22,33,55,66] 9 func(*li) 10 11 动态参数(*args)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def func(**kwargs): 2 print kwargs 3 4 5 # 执行方式一 6 func(name='nick',age=18) 7 8 # 执行方式二 9 li = {'name':'nick', age:18, 'job':'pythoner'} 10 func(**li) 11 12 动态参数(**kwargs)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def hi(a,*args,**kwargs): 2 print(a,type(a)) 3 print(args,type(args)) 4 print(kwargs,type(kwargs)) 5 hi(11,22,33,k1='nick',k2='jenny') 6 也称万能参数
3、全局与局部变量
全局变量在函数里可以随便调用,但要修改就必须用 global 声明
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ############### 全 局 与 局 部 变 量 ############## 2 #全局变量 3 P = 'nick' 4 5 def name(): 6 global P #声明修改全局变量 7 P = 'jenny' #局部变量 8 print(P) 9 10 def name2(): 11 print(P) 12 13 name() 14 name2()
二、内置函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 1. 绝对值 2 # i = abs(-123) 3 # print(i) 4 5 # 2 all 循环参数,如果每个元素都为真,那么all的返回值为真 6 # r = all([1,2,3,True,False]) 7 # print(r) 8 9 # 3 any 循环参数,如果元素有一真,那么any的返回值为真 10 # i = any([None,'',{},[],(),0,1]) 11 # print(i) 12 13 # 4 14 # bin() # 二进制 0b1011 ob 代表2进制 15 # print(bin(11)) 16 # oct() # 八进制 17 # int() # 十进制 18 # hex() # 十六进制 19 20 # 5 21 # bool ,判断真假,把一个对象转换成布尔值 22 23 # 6 24 # str 25 # list 26 27 # bytes 字节 28 # bytearray 字节列表 29 # 字节和字符串之间的转换 30 # print(bytes("112",encoding="gbk")) 31 32 # 7 33 # chr(33) # 查看ASCII 中对应的字符 34 # ord("t") # 查看字符对应的位置 35 # # ascii 一个字节,8位,2**8 ,256 36 37 # 8 做编译用,把一段字符串编译成一段可执行的代码 38 # compile() 39 40 # 9 得到商和余数商3余1 41 # r = divmod(10,3) 42 # print(r) 43 44 # 10 可以执行一个字符串形式的表达式 45 # ret = eval("1 + 3") # 表达式,返回值 46 # print(ret) 47 # exec 执行py代码 48 # evel 表达式,返回值 49 # compile 编译 50 51 # 11 52 # filter(函数,可迭代对象) 过滤 53 # def f(x): 54 # if x >22: 55 # return True 56 # else: 57 # return False 58 # ret = filter(f,[11,22,33,44,55]) 59 # print(list(ret)) 60 # ret = filter(lambda x:x>22,[11,22,33,44,55]) 61 # print(list(ret)) 62 63 # 12 map(函数,可迭代对象) 64 # ret = map(lambda x:x+100,[1,2,3,4,5]) 65 # print(list(ret)) 66 # ret = map(lambda x:x+100 if x%2 == 0 else x ,[1,2,3,4,5]) 67 # print(list(ret)) 68 69 # 13 70 # globals() # 获取所有的全局变量 71 # locals() 72 # def f1(): 73 # name = 123 74 # print(locals()) 75 # print(globals()) 76 # f1() 77 78 # 14 判断某个对象是否是某个类创建的 79 # li = [11,22,33] 80 # r = isinstance(li,list) 81 # print(r) 82 83 # 15 创建一个可被迭代的东西 84 # obj = iter([11,22,33,44]) 85 # r1 = next(obj) 86 # # next 调用迭代的对象的值 87 # print(r1) 88 89 # 16 90 # max()#取最大值 91 # min()#取最小值 92 93 # 17 求指数2的10次方 94 # i = pow(2,10) 95 # print(i) 96 97 # 18 四舍五入 98 # r = round(3.6) 99 # print(r) 100 101 # 19 求和 102 # sum() 103 104 # 20 一一对应 105 # zip() 106 # li = [11,22,33,44] 107 # l1 = ['a','b','c','d'] 108 # r = zip(li,l1) 109 # print(list(r)) # 结果:[(11, 'a'), (22, 'b'), (33, 'c'), (44, 'd')] 110 111 # 21 排序,同种类型 112 # li = [1,211,22,3,4] 113 # # print(li ) 114 # # li.sort() 115 # # print(li) 116 # 117 # new_li = sorted(li) 118 # print(new_li) 119 120 内置函数
一、map
遍历序列,对序列中每个元素进行操作,最终获取新的序列。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 str = ['a', 'b'] 2 3 def fun2(s): 4 5 return s + "alvin" 6 7 ret = map(fun2, str) 8 9 print(ret) # map object的迭代器 10 print(list(ret))#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 li = [11, 22, 33] 2 3 new_list = map(lambda a: a + 1, li)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 li = [11, 22, 33] 2 sl = [1, 2, 3] 3 new_list = map(lambda a, b: a + b, li, sl)
二、filter
对于序列中的元素进行筛选,最终获取符合条件的序列
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 str = ['a', 'b','c', 'd'] 2 3 def fun1(s): 4 if s != 'a': 5 return s 6 7 8 ret = filter(fun1, str)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 li = [11,22,33,44,55] 2 3 new_list = filter(lambda arg: arg > 22, li) 4 5 print(list(new_list))
三、reduce
对于序列内所有元素进行累计操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from functools import reduce 2 3 def add1(x,y): 4 return x + y 5 6 print (reduce(add1, range(1, 101)))##
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 li = [11, 22, 33] 2 3 result = reduce(lambda arg1, arg2: arg1 + arg2, li)
三、三元运算
三元运算(三目运算),是对简单的条件语句的缩写。
1 result = 值1 if 条件 else 值2 2 3 # 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2”赋值给result变量 4 5 ########## 三 元 运 算 ############ 6 name = "nick" if 1==1 else "jenny" 7 print(name)
四、lambda 表达式
对于简单的函数,存在一种简便的表示方式,即:lambda表达式
1 ######## 普 通 函 数 ######## 2 # 定义函数(普通方式) 3 def func(arg): 4 return arg + 1 5 6 # 执行函数 7 result = func(123) 8 9 ######## lambda 表 达 式 ######## 10 11 # 定义函数(lambda表达式) 12 my_lambda = lambda arg : arg + 1 # 相当于返回值 13 14 # 执行函数 15 result = my_lambda(123)
五、递归
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
- 递归就是在过程或函数里调用自身。
- 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
- 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
- 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def fact_iter(product,count,max): 2 if count > max: 3 return product 4 return fact_iter(product * count, count+1, max) 5 6 print(fact_iter(1,1,5)) 7 print(fact_iter(1,2,5)) 8 print(fact_iter(2,3,5)) 9 print(fact_iter(6,4,5)) 10 print(fact_iter(24,5,5)) 11 print(fact_iter(120,6,5))