python—函数

函数

1. python中函数定义方法:

 1 def  test(x):
 2         '''注释,解释函数用途'''
 3         x=x+1
 4         return x
 5 
 6 def:定义函数的关键字
 7 test:函数名
 8 ():括号内可定义形参
 9 x=x+1:泛指代码块或者程序处理逻辑
10 return:定义返回值

过程:过程就是简单特殊没有返回值的函数(没有返回值返回none)

 

2. 函数参数:

 1 1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元,因此,形参只有在函数内部才有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
 2 2.实参变量可以是常量,变量,表达式,函数等,无论函数是何种类型的量,在进行函数调用时,它们必须有确定的值,以便把这些值传递给形参。因此应用预先赋值,输入等办法使参数获得确定值。
 3 def  calc(x,y):
 4         res=x**y
 5         return res
 6 a=calc(2,3)
 7 print(a)
 8 #运行结果:8
 9 
10 位置变量:(位置参数,一 一对应,缺一不可)
11 def  test(x,y,z):
12         print(x)
13         print(y)
14         print(z)
15 test(1,2,3)
16 
17 def  test(x,y,z):   (关键字参数,无须一一对应,缺一不行多一不行)
18         print(x)
19         print(y)
20         print(z)
21 test(x=1,z=3,y=2)

 

  3.全局变量与局部变量

1 name="zhouyuan"      #全局变量,全局作用域
2 def  change_name():
3     name="zhoutao"    #局部变量,局部作用域
4     print(name)
5 change_name()
6 print(name)
7 #运行结果:zhoutao
8 #       zhouyuan

 

    #如果想要在局部作用域内定义全局变量,使用关键字global

 

 1 name="zy"
 2 def a():
 3     global name
 4     print(name)
 5 def b():
 6     name="zt"
 7     print(name)
 8 a()
 9 b()
10 # 运行结果:zy
11 #         zt

 

   #如果函数的内容无global关键字,优先读取局部变量。对于全局变量只能读取,不能重新赋值

   #如果函数中有global关键字变量本质上就是全局的那个变量,可读取可赋值

 

 1 name="zy"
 2 def a():
 3     global name
 4     name="zz"        #现在zz是全局的
 5     print(name)
 6 def b():
 7     print(name)
 8 a()       
 9 b()
10 #运行结果:zz
11 #          zz        (因为a()先执行,a()已经将全局变量变成name=“zz”)
12 
13 name="zy"
14 def a():
15     global name
16     name="zz"        #现在zz是全局的
17     print(name)
18 def b():
19     print(name)     
20 b()         (先执行b()未执行到global)
21 a()
22 #运行结果:zy
23 #        zz

  #全局变量还可以是列表等类型,并且可以在函数内部对列表进行操作

1 name=["蔡徐坤","朱正廷"]
2 def zy():
3     name.append("范丞丞")
4     print(name)
5 zy()
6 #运行结果:['蔡徐坤', '朱正廷', '范丞丞']

 #函数内套函数

 1 name="蔡徐坤"
 2 
 3 def zy():
 4     name="范丞丞"
 5     def zt():
 6         global name
 7         name="农农"
 8     zt()
 9     print(name)
10 
11 print(name)
12 zy()
13 print(name)
14 
15 #运行结果:蔡徐坤
16 #        范丞丞
17 #        农农

 

  #nonlocal关键字修改上一层变量

 1 name="蔡徐坤"
 2 
 3 def zy():
 4     name="范丞丞"
 5     def zt():
 6         nonlocal name
 7         name="农农"
 8     zt()
 9     print(name)
10 
11 print(name)
12 zy()
13 print(name)
14 
15  #运行结果:蔡徐坤
16 #         农农
17 #         蔡徐坤 

 

  4.函数递归

递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出
1 def calc(n):
2     print(n)
3     if int(n/2)==0:
4         return n
5     return calc(int(n/2))
6 calc(10)
7 #运行结果:10,5,2,1

 

 5.函数作用域

 1 def test1():
 2     print("in the test1")
 3 def test():
 4     print("in the test")
 5     return test1
 6 res=test()
 7 print(res())
 8 #运行结果:in the test
 9 #        in the test1
10 #        None    (test1没有返回值默认返回None)

  

  6.匿名函数 lambda

 1 def calc(x):
 2     return x+1
 3 
 4 res=calc(10)
 5 print(res)
 6 #运行结果:11
 7 
 8 使用lambda匿名函数:
 9 res=lambda x:x+1    【lambda匿名函数后面x是形参,x+1相当于return x+1】
10 print(res(1))
11 #运行结果:2

 

  #修改字符串

1 name="zy"
2 f=lambda x:x+"_sb"
3 res=f(name)
4 print(res)
5 #运行结果:zy_sb

 

 

 7.三个重要函数 map() filter() reduce()

   【1】map函数 (处理列表中的每个元素,得到结果是一个‘列表’,该‘列表’元素个数及位置与原来一样)

 1 #map(处理方法,可迭代对象)
 2 num_1=[1,2,3,4,5,6]
 3 
 4 def map_test(func,array):
 5     ret=[]
 6     for i in array:
 7         res=func(i)
 8         ret.append(res)
 9     return ret
10 
11 print(map_test(lambda x:x+1,num_1))
12 
13 res=map(lambda x:x+1,num_1)
14 print(list(res))
15 
16 #运行结果:[2, 3, 4, 5, 6, 7]
17 #        [2, 3, 4, 5, 6, 7]

 

   【2】filter 函数  (遍历序列中每个元素,判断每个元素,得到布尔值,如果是True则留下来)

 1 movie_people=['sb_alex','sb_zt','zy','sb_wu']
 2 
 3 def filter_test(array):
 4     ret=[]
 5     for i in array:
 6         if not i.startswith('sb'):
 7             ret.append(i)
 8     return ret
 9 
10 print(filter_test(movie_people))
11 #运行结果:['zy']
12 
13 #终极版本
14 movie_people=['alex_sb','zt_sb','zy','wu_sb']
15 
16 def filter_test(func,array):
17     ret=[]
18     for i in array:
19         if not func(i):
20             ret.append(i)
21     return ret
22 
23 res=filter_test(lambda n:n.endswith('sb'),movie_people)
24 print(res)

 

 #使用filter()函数

1 movie_people=['alex_sb','zt_sb','zy','wu_sb']
2 
3 res=list(filter(lambda n:not n.endswith('sb'),movie_people))
4 print(res)
5 #运行结果:['zy']
6 
7 filter()函数后面是可迭代对象,进行for循环,每个元素进行前面的操作,满足操作输出,没有list输出内存地址。list()就是将其转换成列表输出。

 

  【3】reduce 函数

 1 #计算列表元素之积
 2 num_1=[1,2,3,100]
 3 
 4 def reduce_test(func,array):
 5     res=1
 6     for num in array:
 7         res=func(res,num)
 8     return res
 9 
10 print(reduce_test(lambda x,y:x*y,num_1))
11 #运行结果:600
12 
13 #reduce函数(将一个列表进行函数计算最终得一个结果)
14 from functools import reduce     #使用reduce函数python3中必须导入这个模块
15 num_1=[1,2,3,100]
16 print(reduce(lambda x,y:x+y,num_1,0))  
17 #reduce第一个参数是函数,第二个参数是被执行的列表,第三个参数是初始值
18 #运行结果:106

 

 8.内置函数

  1 #python中常用的内置函数
  2 【1】abs()   取绝对值
  3  print(abs(-1))
  4 #结果:1
  5 
  6 【2】all()  判断True False 只要有一个为False就为False  #0,空,None是False,其它为True
  7  print(all([1,2,'3']))
  8  print(all([1,2,'3','']))
  9 #结果:True False
 10 
 11  【3】any() 有一个为真就是True
 12  print(any([0,'']))
 13  print(any([0,'',1]))
 14 #结果:False True
 15 
 16  【4】bin() 十进制转换为二进制
 17  print(bin(3))
 18 #结果:0b11
 19 
 20  【5】bool()   布尔值  #0,空,None是False,其它为True
 21  print(bool(''))
 22  print(bool(None))
 23  print(bool(0))
 24 #结果:False False False
 25 
 26  【6】bytes()  字节编码
 27  name='你好'
 28  print(bytes(name,encoding='utf-8'))
 29 #结果:b'\xe4\xbd\xa0\xe5\xa5\xbd'
 30  print(bytes(name,encoding='utf-8').decode('utf-8'))
 31 #结果:你好
 32 #用什么编码就用什么解码, decode()解码,次例是utf-8编码,所以是utf-8解码
 33 #gbk,utf-8都可以解码,对于ascii码不能编码中文。
 34  
 35  【7】chr()  数字对应的ascii值
 36  print(chr(97))
 37 #结果:a
 38 
 39  【8】dir() 打印方法里的属性
 40  print(dir(dict))
 41 #结果:['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
 42 
 43  【9】divmod()  两数相除返回得数与余数
 44  print(divmod(10,3))
 45 #结果:(3,1)
 46 
 47  【10】eval()  计算字符串中表达式的结果;
 48  express='1+2*(5*1)'
 49  print(eval(express)) 
 50 #结果:11
 51 
 52  【11】hash() #可hash数据类型就是不可变数据类型;不可根据hash值来反推原值
 53  print(hash('1525'))    
 54 #结果:6370411092133961450
 55 #所有字符串或者值对于hash值是一样的,所以对于某个软件字符串hash是一样的,可用来判断软件是否被篡改。
 56 
 57  【12】help()  查看方法如何使用
 58 print(help(all))
 59 
 60  【13】hex()  十进制转化为十六进制
 61  print(hex(12))
 62 #结果:0xc
 63 
 64  【14】oct()  十进制转化为八进制
 65  print(oct(12))
 66 #结果:0o14
 67 
 68  【15】isinstance()  判断数据类型,返回True False
 69  print(isinstance(1,int))
 70 #结果:True
 71 
 72  【16】max()  min() 取最大最小
 73 
 74  【17】ord()  显示字符对应的数字
 75   print(ord(a))
 76 #结果:97
 77 
 78  【18】pow()  次方
 79  print(pow(2,4))   #2**4
 80  print(pow(2,4,3))   #(2**4)%3
 81 #结果:16 1
 82 
 83  【19】reversed()  反转
 84  li=[1,2,3,4]
 85  print(list(reversed(li)))
 86 #结果:[4,3,2,1]
 87 
 88  【20】round()   四舍五入
 89  print(round(3.5))
 90 #结果:4
 91 
 92  【21】slice()  切片操作
 93  li='hello'
 94  s1=slice(3,5)
 95  s2=slice(1,4,2)
 96  print(li[s1])
 97  print(li[s2])
 98 #结果:lo el
 99 
100  【22】sorted()  排序
101  li=[5,1,8,3]
102  print(sorted(li))
103 #结果:[1,3,5,8]
104  li=[{'age':18},{'age':22},{'age':20}]
105  print(sorted(li,key=lambda dic:dic['age']))
106 #结果:[{'age': 18}, {'age': 20}, {'age': 22}]
107 
108  【23】zip()  取key和values的组合值
109   people={'蔡徐坤age':18,
110                 '农农age':19,
111                 '范丞丞age':20}
112   print(sorted(zip(people.values(),people.keys())))
113 #结果:[(18, '蔡徐坤age'), (19, '农农age'), (20, '范丞丞age')]
114 
115  【24】str() 任意类型转化成字符串
116 
117  【25】sum()  求和
118 
119  【26】type() 判断数据类型

 

 9.zip方法

 1 zip方法
 2 print(list(zip(('a','b','c'),(1,2,3))))
 3 #结果:[('a', 1), ('b', 2), ('c', 3)]  (类似拉链,左右对应)
 4 
 5 p={'name':'alex','age':'18'}
 6 print(list(zip(p.keys(),p.values())))
 7 print(list(p.keys()))
 8 print(list(p.values()))
 9 #结果:[('age', '18'), ('name', 'alex')]
10 #     ['age', 'name']
11 #     ['18', 'alex']

 

10.maxmin的高级用法

 1  #【只要是可迭代对象都可以用max与min,原理就是for循环】
 2 li=[1,3,51,6]
 3 print(max(li))
 4 print(min(li))
 5 #结果:51  1
 6 
 7 age_dic={'age1':18,'age2':20,'age3':100}
 8 print(max(age_dic.values()))
 9 print(max(age_dic))      #默认是取key的值
10 #结果:100  age3    
11 
12 li=[(5,'a'),(1,'b'),(3,'e'),(4,'d')]
13 print(list(max(li)))
14 #结果:[5, 'a']
15 
16 li=['a10','b12','c10']      #不同类型之间不能进行比较['a10','b12','c10',100]不行  
17 print(list(max(li)))
18 #结果:['c', '1', '0']
19 
20 终极:
21 people=[{'name':'alex','age':100},
22             {'name':'zy','age':18},
23             {'name':'zt','age':12}]
24 print(max(people,key=lambda dic:dic['age']))
25 #结果:{'name': 'alex', 'age': 100}
posted @ 2018-08-20 11:27  周圆  阅读(209)  评论(0编辑  收藏  举报