当前位置:   article > 正文

函数和lambda笔记_z=x if x else y

z=x if x else y
  1. #!/usr/bin/python3
  2. # 函数的文档
  3. def doc_demo(x,y):
  4. '''
  5. 输入x,y
  6. 获取x、y中的较大值
  7. '''
  8. z = x if x>y else y
  9. return z
  10. # help(doc_demo)
  11. print(doc_demo.__doc__)
  12. # print(help(doc_demo)) # pycharm执行会报错,命令行执行正常
  13. # 多个返回值,自动封装为元组
  14. def sum_and_avg(list):
  15. sum = 0
  16. count = 0
  17. for e in list:
  18. # 如果元素e是数值
  19. if isinstance(e, int) or isinstance(e, float): # isinstance()函数 判断是不是指定类型的实例
  20. count += 1
  21. sum += e
  22. return sum, sum / count
  23. my_list = [20, 15, 2.8, 'a', 35, 5.9, -1.8]
  24. # 获取sum_and_avg函数返回的多个值,多个返回值被封装成元组
  25. tp = sum_and_avg(my_list) #①
  26. print(tp)
  27. # 使用序列解包来获取多个返回值
  28. s, avg = sum_and_avg(my_list) #②
  29. print(s)
  30. print(avg)
  31. # 递归函数:函数内部不断调用自身,必须保证有约束条件(某个时刻返回值是确定的),不然会无穷递归类似于死循环
  32. def fn(n):
  33. if n==0:
  34. return 1
  35. elif n==1:
  36. return 4
  37. else:
  38. return 2*fn(n-1)+fn(n-2)
  39. print(fn(10))
  40. # 形参:形式参数,在函数的定义处定义的参数
  41. # 实参:实际参数,在函数调用处定义的参数
  42. # 关键字(keyword)参数
  43. def girth(key,word):
  44. return (key,word)
  45. print(girth(1,2))
  46. print(girth(key=1,word=2))
  47. # print(girth(1,word=2)) # 混合使用关键字参数和位置参数,位置参数必须要在关键字参数之前
  48. # Python要求将默认值参数定义在形参的最后
  49. def say_hi(name,message='456'):
  50. return (name,message)
  51. def test(x,y,z=3,*name,**value): # 最多支持一个可变参数*和**可变关键字参数,此时可变参数会作为元组输入,可变关键字参数作为词典传入
  52. print('name',name)
  53. print('z',z)
  54. for i in name:
  55. print('i的值是%s'%(i))
  56. print('value',value)
  57. test(1,2,3,'123',4,'567',value1=1,value2=2)
  58. test(1,2,value1=1,value2=2) # 若想默认值参数z生效,则只能将前面的位置参数传入,后面使用关键字参数
  59. # 可变个数参数:本质是多个参数作为元组传入;位置可前可后,一个函数只能带一个普通的参数收集的形参
  60. def autoDemo(a,*b):
  61. print(a)
  62. print()
  63. for i in b:
  64. print(i,end=",")
  65. autoDemo(1,2,3,4,5,6,7)
  66. # 逆向参数收集:将sequence中的元素拆开传入函数,列表和元组为*;字典**,会以关键字参数的方式传入
  67. def reversal(name,*values):
  68. print('name的参数',name)
  69. print('valuses的参数',values)
  70. listdemo=['name1',1,2,3]
  71. reversal(*listdemo)
  72. a,b=6,7
  73. a,b=b,a #右边会封包,然后传给左边
  74. print(a,b)
  75. '''
  76. 函数的参数传递机制
  77. python函数的参数传递方式为值传递:将实际参数的副本传入函数,而参数本身不受影响
  78. 指针变量(引用变量)
  79. 1、程序开始创建了一个字典对象,并定义了一个dw引用变量指向字典对象,这意味着此时内存中有两个东西:对象本身和指向该对象的引用变量。
  80. 2、主程序中的 dw 是一个引用变量(也就是一个指针),它保存了字典对象的地址值,当把 dw 的值赋给swap()函数的dw参数后,就是让swap()的dw参数也保存这个地址值,即也会引用到同一个字典对象。
  81. 1、不管什么类型的参数(实参),在Python函数中对参数直接使用"="符号赋值是没用的 ,直接使用“=”符号赋值并不能改变参数(实参)。
  82. 2、如果需要让函数修改某些数据,则可以通过把这些数据包装成列表、字典等可变对象,然后把列表、字典等可变对象作为参数传入函数,在函数中通过列表、字典的方法修改它们,这样才能改变这些数据。
  83. '''
  84. # 变量值参数输入不会改变
  85. def swap(a , b) :
  86. # 下面代码实现a、b变量的值交换
  87. a, b = b, a
  88. print("swap函数里,a的值是", \
  89. a, ";b的值是", b)
  90. a = 6
  91. b = 9
  92. swap(a , b)
  93. print("交换结束后,变量a的值是", \
  94. a , ";变量b的值是", b)
  95. # 指向性参数传入可改变
  96. def swap(dw):
  97. # 下面代码实现dw的a、b两个元素的值交换
  98. dw['a'], dw['b'] = dw['b'], dw['a']
  99. print("swap函数里,a元素的值是",\
  100. dw['a'], ";b元素的值是", dw['b'])
  101. # 把dw直接赋值为None,让它不再指向任何对象
  102. dw = None
  103. dw = {'a': 6, 'b': 9}
  104. swap(dw)
  105. print("交换结束后,a元素的值是",\
  106. dw['a'], ";b元素的值是", dw['b'])
  107. # 变量的作用域:变量的作用范围被称为它的作用域
  108. # 局部变量:在函数内部作用
  109. # 全局变量:全局都可作用
  110. # globals():该函数返回全局范围内所有变量组成的“变量字典”
  111. # locals():该函数返回当前局部范围内所有变量组成的“变量字典”
  112. # vars(object):获取在指定对象范围内所有变量组成的“变量字典”。如果不传入object参数,vars()和 locals()的作用完全相同。
  113. # 通过locals()或者globals()获取的全局变量可以被修改,并影响到变量本身;通过locals()获取的局部变量即使修改也不会影响到局部变量
  114. def test():
  115. age = 20
  116. # 直接访问age局部变量
  117. print(age) # 输出20
  118. # 访问函数局部范围的“变量数组”
  119. print(locals()) # {'age': 20}
  120. # 通过函数局部范围的“变量数组”访问age变量
  121. print(locals()['age']) # 20
  122. # 通过locals函数局部范围的“变量数组”改变age变量的值
  123. locals()['age'] = 12
  124. # 再次访问age变量的值
  125. print('xxx', age) # 依然输出20
  126. # 通过globals函数修改x全局变量
  127. globals()['x'] = 19
  128. x = 5
  129. y = 20
  130. print(globals()) # {..., 'x': 5, 'y': 20}
  131. # 在全局访问内使用locals函数,访问的是全局变量的“变量数组”
  132. print(locals()) # {..., 'x': 5, 'y': 20}
  133. print(globals())
  134. # 直接访问x全局变量
  135. print(x) # 5
  136. # 通过全局变量的“变量数组”访问x全局变量
  137. print(globals()['x']) # 5
  138. # 通过全局变量的“变量数组”对x全局变量赋值
  139. globals()['x'] = 39
  140. print(x) # 输出39
  141. # 在全局范围内使用locals函数对x全局变量赋值
  142. locals()['x'] = 99
  143. print(x) # 输出99
  144. print(test())
  145. print(x) # x可以被函数内的globals函数修改
  146. # Python语法规定:在函数内部对不存在的变量赋值时,默认就是重新定义新的局部变量。因此这行代码相当于重新定义了name局部变量,\
  147. # 这样name全局变量就被遮蔽(不在函数内部作用)了,所谓的局部变量遮蔽全局变量,所以下面这段会报错。
  148. # name='123'
  149. # def a123():
  150. # print(name) # 会报错,因为下一行赋值导致全局变量name被局部变量遮蔽,从而报未定义前的引用
  151. # name = 'afv'
  152. # a123()
  153. # print(name)
  154. # 函数中访问遮蔽变量的两种方式
  155. # 1、通过global()函数访问
  156. name='123'
  157. def accessHide1():
  158. print(globals()['name'])
  159. name='456'
  160. accessHide1()
  161. # 2、通过global在函数中定义全局变量:global name声明以后
  162. # 程序会把 name变量当成全局变量,这意味着accessHide2()函数后面对name赋值的语句只是对全局变量赋值,而不是重新定义局部变量
  163. name='charters'
  164. def accessHide2():
  165. global name
  166. print(name)
  167. name='landel'
  168. accessHide2()
  169. # 局部函数:局部函数对外部是隐藏的,只能在其封闭(enclosing)函数内有效
  170. def get_mathCalc(module,n1):
  171. def square(n):
  172. return n*n
  173. def cube(n):
  174. return n*n*n
  175. def factorial(n):
  176. result=1
  177. for i in range(2,n+1):
  178. result *= i
  179. # 在函数内调用局部函数
  180. if module == 'square':
  181. return square(n1)
  182. elif module == 'cube':
  183. return cube(n1)
  184. elif module == factorial:
  185. return factorial(n1)
  186. print(get_mathCalc('square',2))
  187. # 局部函数变量遮蔽
  188. def hideLocal1():
  189. name='charters'
  190. def local1():
  191. # print(name) # 受后面影响,会定义name为局部变量,函数中的name变量被遮蔽导致报错
  192. name=123
  193. # 在局部函数中访问遮蔽变量的方式
  194. def hideLocal2():
  195. name='charters'
  196. def local2():
  197. nonlocal name # 这里nonlocal和global的作用相似,看字面意思
  198. print(name)
  199. local2()
  200. hideLocal2()
  201. # 函数作为变量使用
  202. # 函数也是一种值:所有函数都是function对象,把函数赋值给变量,可以通过变量来调用它
  203. def pow(base, exponent) :
  204. result = 1
  205. for i in range(1, exponent + 1) :
  206. result *= base
  207. return result
  208. # 将pow函数赋值给my_fun,则my_fun可当成pow使用
  209. my_fun = pow
  210. print(my_fun(3 , 4)) # 输出81
  211. # 定义一个计算面积的函数
  212. def area(width, height) :
  213. return width * height
  214. # 将area函数赋值给my_fun,则my_fun可当成area使用
  215. my_fun = area
  216. print(my_fun(3,4)) # 输出12
  217. # 函数可以作为形参传入函数:可以动态改变程序代码-实现在函数内部动态调用不同函数
  218. # 定义函数类型的形参,其中fn是一个函数
  219. def map(data, fn) :
  220. result = []
  221. # 遍历data列表中每个元素,并用fn函数对每个元素进行计算
  222. # 然后将计算结果作为新数组的元素
  223. for e in data :
  224. result.append(fn(e))
  225. return result
  226. # 定义一个计算平方的函数
  227. def square(n) :
  228. return n * n
  229. # 定义一个计算立方的函数
  230. def cube(n) :
  231. return n * n * n
  232. # 定义一个计算阶乘的函数
  233. def factorial(n) :
  234. result = 1
  235. for index in range(2, n + 1) :
  236. result *= index
  237. return result
  238. data = [3 , 4 , 9 , 5, 8]
  239. print("原数据: ", data)
  240. # 下面程序代码3次调用map()函数,每次调用时传入不同的函数
  241. print("计算数组元素的平方")
  242. print(map(data , square))
  243. print("计算数组元素的立方")
  244. print(map(data , cube))
  245. print("计算数组元素的阶乘")
  246. print(map(data , factorial))
  247. # 获取map的类型
  248. print(type(map))
  249. # 函数作为返回值:动态接受不同的局部函数
  250. def get_math_func(funciton):
  251. def square(n):
  252. return n*n
  253. def cube(n):
  254. return n*n*n
  255. def factorial(n):
  256. result=1
  257. for i in range(2,n+1):
  258. result *= i
  259. return result
  260. # 返回子局部函数
  261. if funciton == 'square':
  262. return square
  263. elif funciton == 'cube':
  264. return cube
  265. elif funciton == 'factorial':
  266. return factorial
  267. # 调用函数,接受局部函数
  268. math1=get_math_func('square')
  269. print(math1(2))
  270. math2=get_math_func('cube')
  271. print(math2(3))
  272. math3=get_math_func('factorial')
  273. print(math3(3))
  274. # 使用lambda表达式代替局部函数:1、局部函数名没有意义,2、单行表达式
  275. # 格式:lambda [parameter_list] : 表达式
  276. # lambda 表达式依然有如下两个用途
  277. # 对于单行函数,使用lambda表达式可以省去定义函数的过程,让代码更加简洁。
  278. # 对于不需要多次复用的函数,使用lambda表达式可以在用完之后立即释放,提高了性能
  279. def get_math_func1(function):
  280. if function=='square':
  281. return lambda n:n*n
  282. elif function=='cube':
  283. return lambda n:n*n*n
  284. elif function=='factorial':
  285. return lambda n:n*(n+1)/2
  286. math1=get_math_func1('square')
  287. print(math1(2))
  288. math2=get_math_func1('cube')
  289. print(math2(3))
  290. math3=get_math_func1('factorial')
  291. print(math3(5))
  292. # 通过lambda表达式来调用Python置的map()函数
  293. x=map(lambda n:n*n,range(8))
  294. print(x) #object
  295. print([e for e in x ])
  296. y=map(lambda n:n*n if n%2==0 else 0,range(8))
  297. print([e for e in y])

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/938870
推荐阅读
相关标签
  

闽ICP备14008679号