简学Python第三章_第1页
简学Python第三章_第2页
简学Python第三章_第3页
简学Python第三章_第4页
简学Python第三章_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简学 Python 第三章 简学 Python 第三章 _函数式编程、递归、内置函数 Python 第三章 _函数式编程、递归、闭包 欢迎加入 Linux_Python 学习群 群号: 478616847 目录: 函数式编程 传参与返回值 递归 匿名函数闭包 高阶函数 内置函数 在第三章,我们引入新的概念函数,在以往的代码编写中我 们都是用的过程式编程,函数式编程的特点将过程式编程变 成易于管理调用的小模块, 让重复的代码可以反复的调用,大大减少代码量,懒惰即美 德 一、函数式编程 创建函数 一个函数式由关键字 def ,与函数名与括号冒号, 和括 号中的参数组成,当想要执行函数的时候只需要写

2、上函数名 加括号即可 格式: def function (parameter) 下面就创建一个函 数 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # 创建函数 5 def print_str(): 6 print(Hello World) 7 8 # 调用函数 9 print_str() 第一个函数 变量的作用域 我们看一个例子, 在下面代码中我们先把变量 a=“ haha” 然后在函数中把 a=“ heihei” 最后执行这个函数, 并输出变 量 a 的结果 我们发现为什么 a 不等于 heihei, 而是我们之前赋值的 “ ha

3、ha” 这个现象我们马上揭秘 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 5 a = haha 6 7 # 创建函数 8 def print_str(): 9 a = heihei 10 print(Hello World) 11 12 #调用函数 13 print_str() 14 print( 我是变量 a:,a) 变量的作用域例一 全局变量与局部变量 很明显变量的作用域就是变量在哪一个范围内生效,如 果出了这个范围则无法使用 全局变量:通常全局变量存活在脚本运行结束,并且所 有的函数都可以访问它 局部变量:只能局部变量所在的函

4、数内部调用,并且除 非把局部变量声明成全局变量否则,其他函数均无法调用, 并且局部变量 当所在的函数执行完成后就不存在了 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 4 5 a = haha 6 7 # 创建函数 8 def print_str(): 9 a = heihei 10 print( 我是局部变量 a:,a) 11 12 13 #调用函数 14 print_str() 15 print( 我是全局变量 a:,a) 全局变量与局部变量 global global 就是可以把局部变量变成全局变量的,如果被声 明的局部变量名与全局变量

5、名一样的话,那么局部变量会覆 盖全局变量,切 使用 global 声明变量需要在变量之前声明否则 python 会 告诉你,你需要在 a 前面声明 报错提示: SyntaxWarning: name a is assigned to before global declaration global a 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 a = haha 5 6 # 创建函数 7 def print_str(): 8 global a 9 a = heihei 10 print( 我是局部变量 a:,a) 11 12 #调用

6、函数 13 print_str() 14 print( 我是全局变量 a:,a) gloable 二、传参与返回值 传参 函数用起来比较简单也容易理解,但是参数的变化就比 较多了,在函数括号内就是参数,参数可以接收字符串,数 字,也可以接收字典和列表 并且在调用的时候,我们还可以指定给哪个参数赋什么 值 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # 创建函数 5 def print_str(Name,Age,Aender): 6 print( 7 Name:%s 8 Age:%s 9 Aender:%s 10 %(Name,Age

7、,Aender) 11 12 #用户输入 13 in_name = input( 请输入你的名字: ) 14 in_age = input( 请输入你的年龄: ) 15 in_aender = input( 请输入你的性别: ) 16 17 #固定位置传参 18 print_str(in_name,in_age,in_aender) 19 print() 20 21 #不固定位置传参 22 print_str(in_name,Aender=in_aender,Age=in_age) 传参 当我们想要传入列表或者字典时需要怎么办? 1 #!/usr/bin/env python 2 # -*-

8、coding:utf-8 -*- 3 4 def print_str(lists): 5 if type(lists) = list: 6 print( 7 Name:%s 8 Age:%s 9 Aender:%s 10 %(lists0,lists1,lists2) 11 else: 12 print( 13 Name:%s 14 Age:%s 15 Aender:%s 16 %(listsname,listsage,listsaenber) 17 18 #传入列表 19 userlist = Ben,22,Man 20 print_str(userlist) 21 22 print() 2

9、3 #传入字典 24 userdict = name:Ben,age:022,aender:Man 25 print_str(userlist) 传入字典或列表 默认参数 在函数中还可以设置默认参数,默认参数的意思是这个 参数你可以传值也可以不传值,当不传值的时候这个参数就 等于默认值 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 def print_str(lists,Country=China): 5 if type(lists) = list: 6 print( 7 Name:%s 8 Age:%s 9 Aender:%s 10

10、 country:%s 11 %(lists0,lists1,lists2,Country) 12 else: 13 print( 14 Name:%s 15 Age:%s 16 Aender:%s 17 country:%s 18 %(listsname,listsage,listsaenber,Country) 19 20 #传入列表 21 userlist = Ben,22,Man 22 print_str(userlist) 23 24 print() 25 #传入字典 26 userdict = name:Ben,age:022,aender:Man 27 print_str(use

11、rlist,America) 默认参数 非固定参数 非固定参数的意义在于可以接收任意个值,在你的函数 不确定用户想传入多少个值的时候使用,当然在调用有只有 非固定参数的函数的时候我们可以不传参数。 非固定参数分一个 * 和两个 * ,*args 会把传入的参数变成 元祖, *kwargs 把传入的参数变成字典,当然 *ages 可以是 别的名称,但是在规范中最好使用 *args ,和 *kwargs 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 def print_str(*args,*kwargs): 5 print( 我是 *,a

12、rgs) 6 print( 我是 *,kwargs) 7 8 # 传入列表 9 userlist = Ben,22,Man 10 print_str(userlist,America) 11 print() 12 #传入字典 13 print_str(A = 1,B = 2) 非固定传参 既然形参可以带 *和* ,那么实参也是可以带 *和* ,那 么*就是配合列表使用的, * 就是配合字典的! 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 def print_str(*args,*kwargs): 5 print( 我是 *,args

13、) 6 print( 我是 *,kwargs) 7 8 # 传入列表 9 userlist = Ben,22,Man 10 print_str(*userlist) 11 12 print( 分隔符 ) 13 14 #传入字典 15 userdict = name:Ben,age:022,gender:Man 16 print_str(*userdict) 17 18 解参 解参 实参带 * 就会把列表分解成Ben,22,Man 一个一 个单独的元素传入函数,而 * 会把字典分解成 name=Ben,age=022,gender=Man 这种键值对传入函数。 形参与实参 形参 : 变量只有在被

14、调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。 因此,形参只在函数内部有效。 函数调用结束返回主调用 函数后则不能再使用该形参变量 实参: 可以是常量、变量、表达式、函数等,无论实参是何种 类型的量,在进行函数调用时,它们都必须有确定的值,以 便把这些值传送给形参。因此 应预先用赋值,输入等办法使参数获得确定值 注!当普通参数和默认参数和非固定参数结合使用的时 候,要遵循一个顺序,普通参数在默认参数前面,默认参数 在非固定参数前面 返回值 在正常使用函数的时候,函数是可以把函数内部处理的 结果返回给函数调用者的,在没有返回值得函数中会保留 None 传给函数调用者,返回值可以

15、返回序列等 在函数执行的时候遇到 return 函数会停止执行,并返回 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 4 # 创建函数 5 def print_str(Age): 6 if int(Age) = 30: 7 return 你才 %s 啊 !真年轻 %(Age) 8 else: 9 return 你都 %s 啦 !老家伙 %(Age) 10 11 in_age = input( 请输入你的年龄: ) 12 word = print_str(in_age) 13 print(word) return 嵌套函数 在函数内部也可以写函

16、数,这样就是外层函数套着内侧 函数,这种形式称之为嵌套函数,同理因为作用域的关系嵌 套函数只能内部调用 return unction_2(stra)+ 我是第二层 n 就等于先 c = unction_2(stra) 然后 return c+ 我是第二层 n 1 def unction(stra): 2 def unction_2(stra_2): 3 return stra_2+ 我是第三层 n 4 return unction_2(stra)+ 我是第二层 n 5 6 r_str = unction() 7 print(r_str+ 我是第一层 ) 嵌套函数 三、递归 前面已经介绍了函数相

17、关的知识,在函数中,函数可以 调用其他的函数,并且函数还可以调用自身,利用这种特性 我们可以完成一些特定的 操作,这种函数调用自身的形式就是递归 def recursion() : return recursion() 在递归中不能像上面两行一样一直调用自身,这样一会 程序就会崩溃,因为它永远的在调用就跟 while 死循环一样 出不去,所以递归也需要进 判断给它出口 例子:阶乘 什么是阶乘,阶乘就是给一个自然数N,然后计算N的 阶乘那么 N = 1x2x3x4N ,这个就是阶乘,我们可以把它 到过来看, N = N x (n-1) x (n-2) x (n-3) 1 一直乘到括号中的值 等于

18、 1,既然知道了阶乘是什么,那么我们来写一个程序实 现它 1 def factorial(n): 2 for i in range(1,n): 3 n *= i 4 return n 5 c = factorial(4) 6 print(c) 阶乘非递归版本 剖析:上面的例子首先把 n=4 传入进去, 然后通过 for i in range(1,4)让i分别等于1,2,3,然后进行 n*=i,我们可以 看出这个 for 循环是循环 3 次的 第一次 (n = n*i) n = 4*1 , 此时 n 还是等于 4 第二次 (n = 4*i) n = 4*2 此时 n = 8 第三次 (n = 8

19、*i) n = 8*3 此时 n 等于 24 此时 for 循环了 3 次所以结束了,通过 return 把 n 的结 果返回,所以最终结果算出 4 的阶乘等于 24 递归版本 面看递归版本的阶乘 1 def factorial(n) : 2 if n = 1: 3 return 1 4 else: 5 return n * factorial(n-1) 6 c = factorial(4) 7 print(c) 阶乘递归版本 剖析: 首先 c = factorial(4) 开始执行函数, 然后进行第一次判断 n = 1 ,显然第一层 n 不等于 1,然后碰到 return n * facto

20、rial(n-1) ,碰到 return 本来是要返回的, 但是 factorial(n-1) 有调用了 factiorial 这个函数,因此进入了第二层 第二层因为上一层传入的参数是 n-1,所以第二层的n 是等于3的,然后判断,这一层的 n也不等于1,然后又进 入第三层 第三层 n 等于 2,然后判断这一层的n 还不等于 1,然 后又进入第四层 到第四层的时候这时的n就等于1,所以触发了 return 1 不再调用函数了,所以就开始返回 返回第三层 return n * factorial(n-1) , 此时 factorial(n-1) 就等于第四层 return 上去的 1,所以第三层

21、返回时就等于 return n * 1 (return 2 * 1 ),并且第三层 n 是等于 2 的 返回第二层 factorial(n-1) 就等于第三层 return 上去的 2, 并且第二层 n 是等于 3 的, return 3 * 2 返回第一层 factorial(n-1) 就等于第二层 return 上去的 6, 并且第一层 n 是等于 4 的, return 4 * 6 到此为止递归执行完毕,c就等于4 * 6 c=24 四、匿名函数 匿名函数也叫 lambda 函数,函数没有具体的名称。 语法: function name= lambda args (多个参数用逗号隔开):

22、 Expression (表达式,表达式的结果就是返回值) 先来看一个最简单例子 1 # 普通函数 2 def func(arg1,arg2): 3 return arg1-arg2 4 5 #lambda 函数 6 func_2 = lambda arg1,arg2: arg1-arg2 7 8 # 传参执行 9 print(func(5,4) 10 print(func_2(5,4) 匿名函数 有认识,这个匿名函数和普通函数没有什么区别么,其 实匿名函数就像三元运算一样, 并且能够用 lambda 函数有几 大优势 1、在一些不会再别的地方调用的函数,我们可以使用 匿名函数,并且这样简化了

23、代码,看起来更加整洁。 2、 lambda 函数将会搭配一些内置函数来使用(下面会 涉及到) 五、闭包 在上面的示例中知道了函数可以调用函数本身,这种形 式称之为递归,那么还可以将函数作为参数返回,这种形式 就称之为闭包 闭包最大的好处就是即用即调,闭包对于安装计算,隐 藏状态,以及在函数对象和作用域中随意地切换是很有用 的! 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 def func(rate): 4 count = 0 5 def add_func(arg): 6 count0 +=1 print(第%s 次调用count0) a

24、rg = arg - arg*rate return arg 10 return add_func 11 12 closure = func(0.03) 13 print(closure(1000) 14 print(closure(1100) 15 print(closure(1200) 闭包示例 例子中做了一个减去手续费后返回余额的功能,首先执 行了 func 函数,将利率封装了进去,然后, func 函数把它内 部的函数进行了进行了返回 要知道当函数不加括号的时候是不执行的! ,所以此时 closoure 就是 add_func 函数的内存地址, 当想要使用这个功 能的时候,直接把 cl

25、osoure 加括号 并传入值即可执行。并且可以看到的是在全局作用域中 执行,随时可以切换到局部作用域。 六、高阶函数 函数可以用来当做返回值,可以用调用自己本身,高阶 函数就是函数的参数把另一个函数作为参数,这种函数就称 之为高阶函数。 1 def func_1(num): return num+1 4 def func_2(num): 5 return num-1 6 7 def func_main(num,func): 8 # 可以简写成 return func(num) 9 results = func(num) 10 return results 11 12 results = fu

26、nc_main(10,func_1) 13 print(results) 14 print(func_main(10,func_2) 高阶函数 编写高阶函数,就是让函数的参数能够接收别的函数。 七、内置函数 内置函数就是 python 中内置的一些方法, 内置函数官方 介绍请猛戳这里 内置函数使用方法示例 ,详细介绍请参考 1 # !/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # 返回数字的绝对值。参数可以是整数或浮点数。 如果 参数是复数,则返回其大小。 5 print(abs(-1.11) 6 7 # 传入一个可被循环的元素,如果这个元

27、素中有一个为 False则都为假 8 # 0 空值 False 都为假 9 print(all(1,2,3) 10 11 #与 all 相反,只有一个为真,则为真; 12 print(any(0,2,False) 13 13 #这个函数跟repr()函数一样,返回一个可打印的对象字 符串方式表示。当遇到非 ASCII 码时 14 #就会输出x , u或U等字符来表示。与Python 2版本里 的repr()是等效的函数。 15 print(ascii(dsads),ascii(66),ascii(b23) 17 18 #将十进制转换为二进制; 19 print(bin(10) 20 21 #返

28、回布尔值,即True或False之一,如果参数为false或 省略,则返回 False; 否则返回 True。 22 print(bool(1) 23 23 #根据传入的参数创建一个新的字节数组 24 #如果传入字符串必须给出编码 25 print(bytearray( 你好 ,utf-8) 26 #当 source 参数是一个可迭代对象,那么这个对象中的元 素必须符合大于 0 小于 256 27 print(bytearray(256,1,2) 29 28 #返回一个的“ bytes”对象,返回bytes类型 29 bytes(中文,utf-8) 32 30 #检查对象是否可以被调用 31

29、def func(): 32 pass 33 print(callable(func) 37 38 # 返回整数所对应的 Unicode 字符 ,ch(r 97)返回字符串 a, 而 chr (8364)返回字符串 ? 。 39 print(chr(126) 40 41 #是用来指定一个类的方法为类方法,类方法可以不实例 化直接调用 42 class A: 43 classmethod 44 def B(cls,arg1,): 45 print(arg1) 46 A.B(1) 47 A().B(1) 48 49 #将源编译为代码或者 AST 对象。代码对象能够通过 exec 语句来执行或者ev

30、al ()进行求值。 50 #源可以是正常字符串,字节字符串或AST 对象。 51 expr = 5+5-1 52 obj = compile(expr,eval) 53 print(eval(obj) 54 54 #返回值为 real + imag * j 的复数或者转化一个字符串或 数为复数。如果第一个参数为字符串,则不需要指定第二个 参数 55 print(complex(1, 2) 56 print(complex(1) 57 print(complex(1+2j) 59 60 61 该字符串必须是对象 62 # 参数是一个对象和一个字符串 属性之一的名称。 63 class A: 6

31、4 def a1(self): 65 print(a1) 66 def a2(self): 67 print(a2) 68 69 obj = A 70 print(dir(obj) 71 delattr(obj, a1) 72 print(dir(obj) 73 74 #dir 返回对象中的方法 75 strs=aaa 76 print(dir(strs) 77 78 #返回两个数值的商和余数 79 print(divmod(7,3) 80 81 #用于遍历序列中的元素以及它们的下标 82 print(enumerate(1,2,3)# 返回的是可迭代的对象 83 for i,j in enu

32、merate(A,B,C): 84 print(i,j) 85 86 #将字符串 str 当成有效的表达式来求值并返回计算结 果。 87 print(eval(1+2+3) 88 print(eval(False or True) 89 90 #字符串 str 当成动态语句块执行并返回结果 91 exec(a=1+2+3) 92 print(a) 93 94 #使用指定方法 (方法,函数 ),过滤可迭代对象的元素 95 def add(arg): 96 return arg 3 97 98 for i in filter(add,1,2,3,4,5): 99 print(i) 100 101

33、#浮点型 102 print(float(11) 103 104 #格式化显示 更多方法请参考官方说明 105 print(:,.2f.format(111111) 106 107 #根据传入的参数创建一个新的不可变集合 108 a = frozenset(1,2,3,4,5) 109 print(a) 110 111 #获取对象的属性值 112 class A(): 113 def _init_(self,): 114 = 123 115 b = A() 116 print(getattr(b,name) 117 118 #返回当前作用域内的全局变量和其值组成的字典 11

34、9 print(globals() 120 121 #检查对象是否含有属性 122 class A(): 123 def _init_(self,): 124 = 123 125 b = A() 126 print(hasattr(b,name) 127 128 #哈希值计算 129 #在当前环境中是唯一的 130 print(hash(Hello) 131 132 #help 帮助 133 def funcs(args): 134 HHH 135 Function description 136 :param args: args = list 137 :return:

35、138 HHH 139 pass 140 print(help(funcs) 141 142 #转换 16 进制 143 print(hex(44) 144 145 #显示对象的标识符 146 print(id(123) 147 148 #input 标准输入 149 s = input(user name: ) 150 print(s) 151 152 #int 返回整数 153 print(int(1.2) 154 print(int(2) 155 156 #判断对象是否是类或者类型元组中任意类元素的实例 157 print(isinstance(1,int) 158 print(isin

36、stance(1.1,(int,float) 159 160 161 #判断类是否是另外一个类或者类型元组中任意类元素 的子类 162 print(dir(str) 163 print(issubclass(bytearray,str) 164 print(issubclass(bool,int) 165 166 #根据传入的参数创建一个新的可迭代对象 167 a = iter(12345) 168 print(next(a) 169 print(next(a) 170 171 #返回对象的长度 len 172 a = 1,2,3,4 173 174 #转换列表 175 print(list(

37、abcd) 176 177 #返回当前作用域内的局部变量和其值组成的字典 178 def A(): 179 print(locals() 180 s = 1 181 print(locals() 182 A() 183 184 #使用指定方法去作用传入的每个可迭代对象的元素,生 成新的可迭代对象 185 def add(x): 186 return x+100 187 lists = 1,2,3,4 188 for i in map(add,lists): 189 print(i) 190 191 #max :返回最大值 192 print(max(1,2,3) 193 print(max(1

38、,2,3,4) 194 194 #在进行切片并赋值数据时,不需要重新copy 原列表数 据,可以直接映射原数据内存; 195 s = memoryview(babcd) 196 print(s1) 198 197 #返回最小值 198 print(min(1,2,3) 199 print(min(2,3) 202 200 #返回可迭代对象中的下一个元素值 201 a = iter(1234) 202 print(next(a) 206 207 #创建一个新的 object 对象(新式类 ) 208 class B(object): 209 pass 210 211 #转化成 8 进制数字符串

39、212 print(oct(10) 213 214 #open 文件操作 215 file = open(test.txt,encoding=utf-8) 216 217 #ord :返回 Unicode 字符对应的整数 218 print(ord(A) 219 220 #幂运算 221 222 print(pow(2,3) 223 224 #标准输出 225 print() 226 227 #property :标示属性的装饰器 228 #类中使用具体方法请百度,或者等待后续更新 229 property 230 231 #range:根据传入的参数创建一个新的range对象 232 ran

40、ge(10) 233 range(1,10) 234 234 ”repr ()函数得到的字符串通常可以用来重新获得该 对象,repr ()的输入对 python比较友好。 235 通常情况下 obj=eval(repr(obj) 这个等式是成立的。 236 obj=Python 237 print(eval(repr(obj) 239 240 238 #翻转序列 239 a = reversed(1,2,3,4,5) 240 print(list(a) 244 241 #round :对浮点数进行四舍五入求值 242 print(round(1.5) 247 248 #set 转换成集合 249

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论