day03-函数

  1 形参:位置参数:必须传
  2     *args:动态参数,可以接收任意多个位置参数
  3     默认值参数:可以传也可以不传
  4     **kwargs:动态参数,可以接收多个关键字参数。
  5 实参:按照位置传参,按照关键字传参。
  6 
  7 #顺序:位置参数,*args,默认值参数,**kwargs。
  8 def test(a,*args,t=10,**kwargs):   #t=10是默认值参数,要放在**kwargs前面。
  9     print(args,kwargs,t)
 10 test(1,23,3,12,45,3,1,5,1,3,5,1,3,t=200,a='asdf',b='awea') #t=200是关键字传参。
 11 
 12 def test1(*args):           #args是元组。
 13     print(args)
 14 a = (1,2,3,87,45,3,43,645)
 15 test1(*a)                   #将元祖a打散成多个元素传参。
 16 
 17 def test3(*args):
 18    print(*args)        #args是元组,*args是打散元组,所以执行结果是1 2 3
 19    print(args)        #结果是(1,2,3)
 20 test3(1,2,3)
 21 
 22 
 23 def test2(**kwargs):    #形参**kwargs将传入的参数放在字典里面。kwargs是字典。
 24     print(kwargs)
 25 b = {'c':1,'t':23}
 26 # test2(**b)              #实参**b将字典打散为键值对传给形参。跟下行代码test2(c=5,t=10)的效果一样。
 27 test2(c=1,t=23)
 28 
 29 def a():
 30     return 2
 31 print(a())  #函数名()=返回值。 a()=2
 32 
 33 def b(*args):
 34     return args
 35 print(b(1,2,3))
 36 
 37 
 38 默认值参数的陷阱
 39 def test(a=[]):
 40     a.append(1)
 41     print(a)
 42 test()         #因为a是默认值参数,所以调用函数的时候可以不传参,执行结果是[1]
 43 test()         #[1,1]
 44 test()         #[1,1,1]
 45 
 46 
 47 
 48 返回值
 49 没有返回值:返回None
 50         1.不写return
 51         2.只写return :结束函数,return下面的代码不执行。
 52         3.写return None 不常用
 53 返回一个值:
 54         可以返回任何数据类型:数字,字符串,元组,列表,字典等等。
 55         如果有多个return,只执行第一个。
 56 返回多个值:
 57         多个返回值要用多个变量接收。
 58 def test():
 59     return 1,2,3
 60 a1,a2,a3=test()  #多个返回值要用多个变量接收。
 61 print(a1,a2,a3) #打印出1 2 3
 62 print(test())   #打印出元组(1,2,3)
 63 
 64 def a(b):
 65     return b[1::2] #返回奇数索引对应的值
 66 print(a([1,3,3,6,1,4]))
 67 
 68 def a(b):
 69     return len(b)<5  #返回传入的字符串的长度是否小于5
 70 print(a('adsfadsf'))
 71 
 72 def test(n):
 73     if len(n)>2:   #检查传入的列表的长度是否大于2,如果是,返回前面两个元素。
 74         return n[:2]
 75 print(test([1,2,3,4]))
 76 
 77 def test(list):
 78     '''函数注释:统计传入的参数有多少个字母(字母包含汉字),数字,空白符,其他字符'''
 79     alpha = 0
 80     digit = 0
 81     space = 0
 82     other = 0
 83     for i in list:
 84         if i.isalpha():   #如果i是字母为True
 85             alpha += 1
 86         elif i.isdigit(): #数字
 87             digit += 1
 88         elif i.isspace(): #空白符
 89             space += 1
 90         else:             #其他
 91             other += 1
 92     return alpha,digit,space,other
 93 print(test('asdfasdfas  asdgasdg asdfasdawe645a4s4df 646 465a4 64 646 46 46 465****、、、 '))
 94 
 95 def test(n):
 96     dic={'alpha':0,'digit':0,'space':0,'other':0} #利用字典简化代码,并且返回字典,让别人易读。只看结果就知道字母,数字,空白符,其他,一共多少个。
 97     for i in n:
 98         if i.isalpha():
 99             dic['alpha'] += 1
100         elif i.isdigit():
101             dic['digit'] += 1
102         elif i.isspace():
103             dic['space'] += 1
104         else:
105             dic['other'] += 1
106     return dic
107 print(test('asdfa 44 6a4 645 6a6dfa687df6a**a*d*f*a*d*f*'))
108 
109 def test(dic):
110     for k in dic:
111         if len(dic[k]) > 2:
112             dic[k] = dic[k][:2]
113     return dic
114 print(test({'adf':'dfa','vb':'cdag','oe':'desfg'}))
115 
116 
117 def test(a,b):  #接收两个数字,返回小的
118     return  a if a<b else b #三元运算,简化代码,适合简单的情况
119 print(test(1,5))
120 
121 
122 a = 0               #全局变量
123 def outer():
124     b=2             #局部变量
125     def inner():    #嵌套函数
126         nonlocal b  #nonlocal 声明b是外层函数的变量
127         b=20000000  #修改b的值
128     inner()
129     print(b)
130     global a        #声明a是全局变量。如果想修改全局变量,必须先声明
131     a=10000000      #修改a的值
132 outer()
133 print(a)
134 
135 
136 
137 闭包:闭包的好处是外部函数变量a长期存放在内存当中,不会因为外部函数多次被调用而多次生成,导致占用空间。
138 def outer():
139     a=1
140     def inner():
141         print(a)    #内部函数调用外部的变量,叫做闭包。这里调用了a.
142     return inner    #inner()是调用inner函数,inner没有()是函数对象的意思。这里返回函数对象的地址给outer()。因为函数名()=返回值,所以outer()=inner.
143 outer()()         #因为outer()=inner,所以outer()()=inner(),这样就可以调用内部函数。

 

posted @ 2019-01-14 17:11  梁劲雄  阅读(122)  评论(0编辑  收藏  举报