【Python学习笔记】第八章 函数


文章目录

  • 【Python学习笔记】第八章 函数
  • 前言
  • 8.1 定义函数
  • 8.2 调用函数
    • 8.2.1 使用位置参数调用函数
    • 8.2.2 使用关键字参数调用函数
  • 8.3 参数的默认值
  • 8.4 可变参数
    • 8.4.1 基于元组的可变参数(*可变参数)
    • 8.4.2 基于字典的可变参数(**可变参数)
  • 8.5 函数中变量的作用域
  • 8.6 函数类型
    • 8.6.1 理解函数类型
    • 8.6.2 过滤函数filter()
    • 8.6.3 映射函数map()
  • 8.7 lambda()函数
  • 待更新lambda()几个好的例子
  • 总结

前言

在程序反复执行的某些代码,可以使用函数来封装。函数具有 函数名参数和返回值 。Python中的函数很灵活:可以在模块中但是类之外的定义,作用域是当前模块,我们称为函数; 也可以在别的函数中定义,我们称之为嵌套函数 ; 还可以在类中定义。

8.1 定义函数

自定义函数的语法格式如下:

def 函数名(形式参数列表):函数体return 返回值

注意事项:1. 缩进一般采用四个空格,2. 如果没有数据返回可以省略 return 语句

Q: 什么是形式参数?
A: 由于定义函数时的参数不是实际数据,会在调用函数时传递给他们实际数据,所以我们称定义函数时的参数为 形式参数 ,简称 形参 ;称调用函数时传递的实际数据为 实际参数 ,简称 实参 。可以将形式参数理解为函数中定义的变量。

实例代码:

def rect_area(width , height):area = width * heightreturn areadef print_area(width , height):area = width * heightprint("{0} X {1} 长方形的面积:{2}".format(width , height , area))

8.2 调用函数

在定义好函数后,就可以调用函数了。

8.2.1 使用位置参数调用函数

在调用函数时传递的实参与定义函数时的形参顺序一致,这就是调用函数的基本目的。
代码示例:

def rect_area(width , height): # 形参列表area = width * heightreturn arear_area = rect_area(220 , 440) # 调用函数,实参列表,顺序与形参一致
print("{0} X {1} 长方形的面积为: {2}".format(220 , 440 , r_area))-----输出:-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
220 X 440 长方形的面积为: 96800

8.2.2 使用关键字参数调用函数

在调用函数时可以采用 关键字 = 实参 的形式 ,其中关键字的名称就是自定义函数时形参的名称。

def rect_area(width , height):area = width * heightreturn arear_area = rect_area(width = 220 , height = 330) # 关键字的名称就是定义函数的名称
print("{0} X {1} 长方形面积是{2:.2f}".format(220 , 330 , r_area))r_area = rect_area(height = 220 , width = 330) # 实参不受形参的顺序影响
print("{0} X {1} 长方形面积是{2:.2f}".format(220 , 330 , r_area))-----输出-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
220 X 330 长方形面积是72600.00
220 X 330 长方形面积是72600.00

使用关键字参数调用函数时,调用者能很好很清晰的看出传递参数的含义,提高函数调用的可读性。

8.3 参数的默认值

函数重载会增加代码量,所以在Python中没有函数重载的概念,而是为函数的参数提供默认值实现的。

def play_sport( name = '羽毛球'): # 默认值return '我们一起去玩{0}'.format(name)sport1 = play_sport(name = '巴西柔术') # 提供参数
sport2 = play_sport() # 没有提供参数,使用默认值print(sport1)
print(sport2)-----输出-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
我们一起去玩巴西柔术
我们一起去玩羽毛球

8.4 可变参数

Q: 当我们使用 format() 格式化字符串的方法时,可以有1个参数也可以传递3个参数。WHY?
print("{0} X {1} 长方形面积是{2:.2f}".format(220 , 330 , r_area))
print("{0} X {1} 长方形面积是{2:.2f}".format(220 , 330 , r_area))

A: Python中的函数可以定义接受不确定数量多的参数,这种参数称为可变参数。可变参数有两种,在参数前面加* 或者 **

8.4.1 基于元组的可变参数(*可变参数)

*可变参数在函数中被组装成一个元组
实例代码:

def sum(*numbers): # 可变参数total = 0.0for i in numbers:total += ireturn totalprint(sum(100.0 , 200.0 , 456.789)) # 多个参数被组装成元组numbers
print(sum(122.345 , 222.333)) # 多个参数被组装成元组numbers-----输出-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
756.789
344.678

8.4.2 基于字典的可变参数(**可变参数)

** 可变参数在函数中被组装成一个字典

实例代码:

def show_info(**info): # 可变参数print('-----show info-----')for key , value  in info.items():print('{0} ---{1}'.format(key , value))show_info(name = 'starkk' , age = '21' , handsome = True)
show_info(SID = '77z11' , Unikey = 'handsome1234' , studdent_hobby = 'badminton')-----输出-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
-----show info-----
name ---starkk
age ---21
handsome ---True
-----show info-----
SID ---77z11
Unikey ---handsome1234
studdent_hobby ---badminton

注意点:

show_info(name = 'starkk' , age = '21' , handsome = True)
多个参数被组装成info,字典的键是 name , age , handsome ,字典的值是 'starkk''21'True

show_info(SID = '77z11' , Unikey = 'handsome1234' , studdent_hobby = 'badminton')
多个参数被组装成字典info, 字典的键是 SID , Unikey , student_hobby ,字典的值是 '77z11', 'handsome1234' , 'badminton'

8.5 函数中变量的作用域

变量可以在模块中创建,作用域(变量的有效范围)是整个模块,称为全局变量。变量也可以在函数中创建,在默认情况下作用域是整个函数,被称为局部变量

代码示例:

x = 20 # 在模块中定义变量x , 作用域是整个模块def print_value():x = 10 # 在模块中定义变量x , 作用域是整个函数,它会屏蔽模块变量xprint("函数中 x = {0}".format(x))print_value()
print("全局变量 x = {0}".format(x))-----输出结果-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
函数中 x = 10
全局变量 x = 20

小提示: 一般情况下尽量不要在模块和函数中定义两个相同名变量,但是他们两个是不同的变量,因为会发生冲突,函数中的同名变量会屏蔽模块中的同名变量。对于在模块和函数中各定义的一个同名变量,如果在函数中将其声明为global,则会将函数中的这个同名变量提升为全局变量。

实例代码

x = 20def print_value():global x # 将函数的x变量提升为全局变量xx = 10 # 全局变量提升为10print("函数中 x = {0}".format(x))print_value()
print("全局变量 x = {0}".format(x))-----输出结果-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
函数中 x = 10
全局变量 x = 10

8.6 函数类型

Python中的任意一个函数都有数据类型,这种数据类型是 function ,被称为函数类型。

8.6.1 理解函数类型

函数类型的数据与其他类型的数据是一样的,任意类型的数据都可以作为函数返回值使用,还可以作为函数参数使用,因此一个函数可以作为另一个函数的返回值使用,也可以作为另一个函数的参数使用。

def add(a , b):return a + b # 返回两数之和def sub(a , b):return a - b # 返回两数之差def calc(opr): # 返回function数据类型,即另一个函数add()或sub()if opr == '+':return addelse:return sub# 调用calc()函数返回数据f1 ,f1实际上是add()函数
f1 = calc('+') #f1实际上是add()函数
f2 = calc('-') #f2实际上是sub()函数
print("10 + 5 = {0}".format(f1(10 , 5))) # f1(10 ,5) 是调用f1指向的add()函数,相当于调用add(10 , 5)
print("10 - 5 = {0}".format(f2(10 , 5)))-----输出结果-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
10 + 5 = 15
10 - 5 = 5

小提示: 以上3个函数虽然都是函数类型,但是在细节方面还是有很大区别的, 这个区别主要是函数参数列表。有两个参数的函数和有1个参数的函数是不同的函数类型。

实例代码

# 定义加法函数
def add(a , b):return a + b# 定义减法函数
def sub(a , b):return a - b# 定义平方函数
def square(a):return a * a

小提示: add()sub() 函数有两个数字参数,具有相同的函数类型。square() 函数只有一个数字参数,所以 square()add()sub() 函数的类型不同。

8.6.2 过滤函数filter()

在Python中定义了一些用于数据处理的函数,如filter()map()等。

filter()函数用于对容器中的元素进行过滤处理,filter()函数的语法如下:
filter(function , iterable)
参数function是一个提供过滤条件的函数,返回布尔值。参数iterable是容器类型的数据。

# 提供过滤条件函数
def f1(x):return x > 50 # 找出大于50 元素data1 = [66 , 15 , 91 , 28 , 98 , 50 , 7 , 80 , 99]
filitered = filter(f1 , data1)
data2 = list(filitered) #转换列表
print(data2)-----输出结果-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
[66, 91, 98, 80, 99]

注意: filter()函数的返回值并不是一个列表,如果需要返回列表类型数据,则通过list() 函数进行转换。

8.6.3 映射函数map()

map()函数用于对容器中的元素进行映射(或者转换),map()函数的语法如下:
map(function , iterable)
参数function是一个提供变换规则的函数,返回变换之后的元素。参数iterable是容器类型数据。

#提供变换规则的函数
def f1(x):return x * 2 # 变换规则乘以2data1 = [66 , 15 , 91 , 28 , 98 , 50 , 7 , 80 , 99]
mapped = map(f1 , data1)
data2 = list(mapped) # 转换为列表
print(data2)-----输出结果-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
[132, 30, 182, 56, 196, 100, 14, 160, 198]

8.7 lambda()函数

我们之前学习的函数都是有名称的函数,例如rect_area() 函数, rect_area就是其函数名。我们也可以定义匿名函数,匿名函数就是没有名称的函数。

在Python中使用lambda关键字定义匿名函数。lambda关键字定义的函数也被称为lambda()函数。语法如下:
“参数列表”与函数的参数列表是一样的,但不需要用小括号括起来。
lambda 参数列表: lambda体

注意: lambda体部分不能是一个代码块,不能包含多条语句,只有一条语句,语句会计算一个结果并返回给lambda()函数,但与有名称的函数不同的是,不需要使用return语句返回。

代码示例:

def calc(opr):if opr == '+':return lambda a , b :(a + b)else:return lambda a , b :(a - b)f1 = calc('+')
f2 = calc('-')print("10 + 5 = {0}".format(f1(10 ,5)))
print("10 - 5 = {0}".format(f2(10 ,5)))-----输出结果-----
>>>
===== RESTART: /Users/starkk/Downloads/8_2_1.py ====
10 + 5 = 15
10 - 5 = 5

待更新lambda()几个好的例子

总结

加油小伙伴们,集美们。

【Python学习笔记】第八章 函数相关推荐

  1. Python学习笔记11:函数修饰符

    Python学习笔记11:函数修饰符 Python有很多有趣的特性,其中函数修饰符就是一个. 我们在之前的那个web应用示例中用过如下写法: @web.route('/log') @符号后边的,就是一 ...

  2. python学习笔记之自定义函数

    live long and prosper 自定义函数 def greet_user():"""现实简单的问候语"""print(" ...

  3. 深度之眼 - Python学习笔记——第八章 文件、异常和模块

    第八章 文件.异常和模块 实际应用中,我们绝大多数的数据都是通过文件的交互完成的 8.1 文件的读写 8.1.1 文件的打开 文件的打开通用格式 with open("文件路径", ...

  4. Python学习笔记:返回函数

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记7:函数对象及函数对象作參数

    一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给 ...

  6. Python学习笔记---理解zip()函数

    转载自Python零碎知识(2):强大的zip 一.代码引导 首先看这一段代码: 1 >>> name=('jack','beginman','sony','pcky')2 > ...

  7. python学习笔记10-匿名函数lambda

    匿名函数lambda 定义匿名函数 lambda def fun(x,y): return x*y r=lambda x,y: x*y r(3,4) In [2]: r = lambda x, y: ...

  8. [Python学习笔记][第八章Python异常处理结构与程序调试]

    1/30 第八章Python异常处理结构与程序调试 异常处理 try-except结构 try:try块 except Exception:except块 try-except-else结构 try: ...

  9. Python学习笔记之eval函数简析

    一个最基本的eval()函数的格式应该如下: >>> command = 'print(\'Hello world!\')' >>> eval(command) H ...

  10. python学习笔记:插入函数append,extend与insert的使用与区别

    python中的几个插入函数: append( )函数    函数功能:append( )函数是在列表末尾添加新的对象. 易错点:使用 append() 函数添加列表时,是添加列表的「引用地址」而不是 ...

最新文章

  1. java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...
  2. python 文件获取绝对路径
  3. PHP代码审计基础手册
  4. 8.了解如何把vector和string数据传给旧的API
  5. python脚本式编程_Python编程入门(一)
  6. python3 image_python3 ImageTk 安装方法
  7. Linux oracle(常用命令)启动、停止、监听
  8. CentOS安装nextcloud-17.0.0
  9. Linux命令之sed使用入门概述
  10. GitLab CI/CD实践
  11. [导入]从飞信到SNS,中国移动进军互联网之路,悬乎
  12. 经典算法-(一)汉诺塔(河内之塔)
  13. 易优CMS插件大全-采集翻译发布插件
  14. 网页服务器阿帕奇怎么启动服务,阿帕奇服务器使用教程
  15. x.264编译问题合集
  16. 拳头产品|海泰虎讯,新一代安全即时通讯系统
  17. 电脑重装系统后无法上网怎么办
  18. 计算机mc代表什么意思6,我的世界:萌新无法理解的6个老梗,唯老MC才懂!你能看懂几个?...
  19. 《文明3》全攻略之设置篇
  20. Linux电脑睡眠后黑屏打不开,Win10系统下电脑休眠或睡眠无法唤醒屏幕黑屏打不开的解决方法...

热门文章

  1. 【软件定义汽车】SOA协议DDS和Some/IP对比
  2. Linux离线安装git
  3. APS炒币机器人的投资随记No.4:持续震荡多空焦灼之下后市如何布局
  4. 基于FPGA的 DS18B20多功能温度显示
  5. iStylePDF升级了
  6. 高光谱图像处理学习笔记
  7. 基于51单片机的多点温度火灾报警自动灭火系统(实物图+源码+原理图+全套资料)
  8. LSI收购Sandforce
  9. Shellshock漏洞那些事:网络安全噩梦的开始
  10. PHP语言Laravel9+Layui搭建的系统后台框架