Python 【系列教程】之函数和lambda表达式

举报
小米粒-biubiubiu 发表于 2020/12/02 23:18:04 2020/12/02
【摘要】 一、定义函数和调用函数 在使用函数之前必须先定义函数,定义函数的语法格式如下: def   函数名(形参列表): //由零条到多条可执行语句组成的函数 [return [返回值]]       python 的声明函数必须使用def关键字。 # 函数的定义def my_max(x, y): z = x if x &gt...

一、定义函数和调用函数

在使用函数之前必须先定义函数,定义函数的语法格式如下:


  
  1. def   函数名(形参列表):
  2. //由零条到多条可执行语句组成的函数
  3. [return [返回值]]

      python 的声明函数必须使用def关键字。


  
  1. # 函数的定义
  2. def my_max(x, y):
  3. z = x if x > y else y
  4. return z
  5. def say_hi(name):
  6. print("====正在执行say_hi()函数====")
  7. return name + ",您好!"
  8. a = 6
  9. b = 9
  10. print(my_max(a, b))
  11. print(say_hi("段赵旭"))
  12. # 函数说明文档:只要把一段字符串放在函数声明之后,函数体之前,这段字符串将被作为函数的部分,这个文档就是
  13. # 函数的说明文档
  14. # 程序即可通过help()函数查询函数的说明文档,也可通过函数的_doc_属性访问函数的说明文档。下面程序示范了为函数
  15. # 编写说明文档
  16. def my_max(x, y):
  17. """
  18. 获取两个数值之间较大数的函数
  19. :param x:
  20. :param y:
  21. :return:
  22. """
  23. # 定义一个变量z,该变量等于x,y中较大的值
  24. z = x if x > y else y
  25. return z
  26. help(my_max)
  27. print(my_max.__doc__)
  28. # 多个返回值,被自动封装成元组的形式返回
  29. def sum_and_avg(list):
  30. sum = 0
  31. count = 0
  32. for e in list:
  33. if isinstance(e, int) or isinstance(e, float):
  34. count += 1
  35. sum += e
  36. return sum, count
  37. my_list = [20, 15, 2.8, 'a', 35, 5.9, -1.8]
  38. # 元组的形式
  39. tp = sum_and_avg(my_list)
  40. print(tp)
  41. # 使用序列解包的形式
  42. s, avg = sum_and_avg(my_list)
  43. print(s)
  44. print(avg)
  45. # 递归函数
  46. def fn(n):
  47. if n == 0:
  48. return 0
  49. elif n == 1:
  50. return 1
  51. else:
  52. return n * fn(n - 1)
  53. print("fn(10)的结果是:", fn(3))
  54. # 函数关键字的使用
  55. def grith(width, height):
  56. print("width:", width)
  57. print("height:", height)
  58. return 2 * (width + height)
  59. print(grith(3.5, 4.8))
  60. print(grith(width=3.5, height=4.8))
  61. print(grith(height=4.8, width=3.5))
  62. print(grith(3.5, height=4.8))
  63. # 关键字参数必须位于位置参数之后,否则报错
  64. # print(grith(width=3.5,4.8))
  65. # 参数默认值
  66. def say_hi(name="孙悟空", message="欢迎来到疯狂软件"):
  67. print(name, ",您好")
  68. print("消息是:", message)
  69. # 全部使用默认参数
  70. say_hi()
  71. # 只有message参数使用默认值
  72. say_hi("白骨精")
  73. # 两个参数都不使用默认值
  74. say_hi("白骨精", "123")
  75. # 只有name参数使用默认值
  76. say_hi(message="欢迎学习python")
  77. # 定义函数的时候也是一样,默认值参数必须放到位置参数之后
  78. # def test(name="zhangsan",age):
  79. # 个数可变的参数
  80. def test(a, *books):
  81. print(books)
  82. for b in books:
  83. print(b)
  84. print(a)
  85. test(5, "疯狂ios讲义", "疯狂android讲义")
  86. """输出可以看到可变参数传入到函数之后封装成了元组
  87. ('疯狂ios讲义', '疯狂android讲义')
  88. 疯狂ios讲义
  89. 疯狂android讲义
  90. 5"""
  91. # 定义了支持参数收集的函数
  92. def test(x, y, z=3, *books, **scores):
  93. print(x, y, z)
  94. print(books)
  95. print(scores)
  96. test(9, 8, 3, "asd", "asd", 语文="sad", 数学="math")
  97. """输出
  98. 9 8 3
  99. ('asd', 'asd') 可变长参数变成了元组
  100. {'语文': 'sad', '数学': 'math'} 可变长关键字参数变成了字典
  101. """
  102. def test(name, message):
  103. print()
  104. print()
  105. my_list = ['孙悟空', '欢迎来到疯狂软件']
  106. test(*my_list)
  107. # 逆向参数收集
  108. def foo(name, *nums):
  109. print("name参数:", name)
  110. print("nums参数:", nums)
  111. my_tuple = (1, 2, 3)
  112. foo("asd", *my_tuple)
  113. # 字典关键字参数:程序使用逆向收集即可将my_dict包含的三个kv对以关键字参数的形式传给
  114. # bar()函数
  115. def bar(book, price, desc):
  116. print(book, "这本书的价格是:", price)
  117. print('描述信息', desc)
  118. my_dict = {'price': 89, 'book': '疯狂python讲义', 'desc': '这是一本系统全面的python学习图书'}
  119. bar(**my_dict)
  120. # 变量作用域
  121. """python提供了如下的三个工具函数来获取指定范围内的变量字典
  122. globals() 该函数返回全局范围内所有变量组成的变量字典
  123. locals() 该函数返回当前局部范围内所有变量组成的变量字典
  124. vars(object) 获取在指定对象范围内所有变量组成的变量字典,如果不传入object
  125. 参数,vars()和locals()的作用完全相同
  126. """
  127. # 在函数中声明全局变量
  128. name = 'Charlie'
  129. def test():
  130. # 声明name是全局变量,后面的赋值语句不会重新定义局部变量
  131. global name
  132. # 直接访问name全局变量
  133. print(name) # charlie
  134. name = "孙悟空"
  135. test()
  136. print(name)
  137. """增加了global name声明之后,程序会把name变量当成全局变量,这意味着test()函数后面对name赋值的语句只是对
  138. 全局变量赋值,而不是重新定义局部变量"""
  139. # 局部函数
  140. def get_math_func(type, nn):
  141. def square(n):
  142. return n * n
  143. def cube(n):
  144. return n * n * n
  145. def factorial(n):
  146. result = 1
  147. for index in range(2, n + 1):
  148. result *= index
  149. return result
  150. if type == 'square':
  151. return square(nn)
  152. elif type == 'cube':
  153. return cube(nn)
  154. else:
  155. return factorial(nn)
  156. print(get_math_func('square', 3))
  157. print(get_math_func('cube', 3))
  158. print(get_math_func('factorial', 3))
  159. def foo():
  160. # 局部变量name
  161. name = 'Charlie'
  162. def bar():
  163. #bar函数中就不必在重新定义name变量,就可以直接访问foo函数中的name变量了
  164. nonlocal name
  165. # 访问bar()函数所在foo()函数内的name局部变量
  166. print(name)
  167. name = '孙悟空'
  168. print(name)
  169. bar()
  170. foo()
  171. """nonlocal和前面的global功能大致类似,区别是global用于声明访问全局变量,而
  172. nonlocal用于声明访问当前函数所在函数内的局部变量"""

二、函数的高级内容


  
  1. # 使用函数变量
  2. def pow(base, exponent):
  3. result = 1
  4. for i in range(1, exponent + 1):
  5. result *= base
  6. return result
  7. my_fun = pow
  8. print(my_fun(3, 4))
  9. def area(x, y):
  10. return x * y
  11. my_fun = area
  12. print(my_fun(3, 4))
  13. def map(data,fn):
  14. return fn(data,data)
  15. print(map(5,my_fun))
  16. #函数可以作为变量,参数,以及函数的返回值
  17. #局部函数没有太大的意义,那么就考虑使用lambda表达式来简化局部函数的写法。
  18. def get_math_func(type):
  19. result = 1
  20. #该函数返回的是lambda表达式
  21. if type == 'sq':
  22. return lambda n:n*n
  23. elif type == 'cube':
  24. return lambda n:n*n*n
  25. else:
  26. return lambda n:(1+n)*n/2
  27. """lambda表达式只能是单行表达式,不允许使用更加复杂的函数形式,
  28. lambda表达式的语法格式如下:
  29. lambda [参数列表]: 表达式
  30. """
  31. x=map(lambda x:x*x,range(8))
  32. print([e for e in x])
  33. y=map(lambda m:m*m if m%2==0 else 0,range(8))
  34. print([e for e in y])

 

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/100534479

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。