1 > 函数的定义与调用
1.1 > 函数的定义1.2 > 函数的调用 2 >函数的返回值
2.1 > 返回值的操作 3 >函数的参数
3.1 > 形参与实参3.2 > 位置参数3.2 > 关键字参数3.3 > 默认参数3.4 > 不定长参数
3.4.1 > *args3.4.1 > **kwargs 3.5 > 可变长参数
1 > 函数的定义与调用 1.1 > 函数的定义Python安装包、标准库中自带的函数统称为内置函数,用户自己变现的函数称之为自定义函数,不管是哪种函数,其定义和调用的方式都是一样的。其中有几点需要注意:
1.函数一定要遵循先定义后调用的原则。就是说定义函数的代码一定要比调用函数的代码先执行。 2.函数在定义阶段只检测语法,并不会执行代码体的内容。 3.函数体代码只有在调用函数的时候才会执行 4.函数名其实相当于是变量名指向的是内存中函数体代码所在位置
定义函数格式:
def func():
print('hollo world')
func() # 这里的意识就是调用这个func() 函数,如果括号内有参数就会传递参数
1.2 > 函数的调用
函数的调用格式如下:
函数名([参数列表])
定义好的函数直到被程序调用时才会执行。例如,调用下列的weather()函数,代码如下:
def weather():
print("*" * 13)
print("日期:3月15日")
print("温度:14~28度")
print("空气状况:良")
print("*" * 13)
weather()
上述程序运行到weather()时才会进入函数,按顺序执行函数体中的代码。程序运行结果如下:
************* 日期:3月15日 温度:14~28度 空气状况:良 *************
调用带有参数的函数时需要传入参数,传入的参数称为实际参数,实际参数是程序执行过程中真正会使用的参数。例如调用一下modify_weather()函数,代码如下:
def modify_weather(today, temp, air_quality):
# 这当中()内today, temp, air_quality 叫做形式参数
print("*" * 13)
print(f"日期:{today}")
print(f"温度:{temp}")
print(f"空气状况:{air_quality}")
print("*" * 13)
modify_weather('3月16日', '12~27度', '优')
# 这当中()内today, temp, air_quality 叫做实际参数
上述程序运行到weather()时为其传入了三个参数,这些参数在函数体被执行时代替了形式参数。程序运行结果如下:
************* 日期:3月16日 温度:12~27度 空气状况:优 *************2 >函数的返回值
函数的返回值其实就是在调用函数之后返回的一个结果,如何获取函数的返回值呢?我们可以定义一个变量将返回值赋值给这个变量,代码格式如下:
变量名 = 函数调用2.1 > 返回值的操作
当函数体代码没有return关键字的时候,返回值是None。例如:
def index():
print('春困秋乏夏打盹儿')
res = index()
print(res) # None
当函数体代码写了return但是没有跟任何值得时候 返回值也是None。例如:
def index():
print('春困秋乏夏打盹儿')
return
res = index()
print(res) # None
当函数体代码写了return并且跟了数据 那么写什么就返回什么。如果写的是值那么直接返回值(任意数据类型),如果写的是变量名那么返回变量名指向的值,例如:
def index():
print('春困秋乏夏打盹儿')
name = 'jason'
return name
res = index()
print(res) # jason
return后面还可以跟多个值 逗号隔开 会自动组织成元组返回出去。例如:
def index():
print('春困秋乏夏打盹儿')
return 111,'jason',222
res = index()
print(res) # (111,'jason',222)
return 类似于循环体当中的break,当函数体代码遇到return时就会立刻结束函数的运行。
3 >函数的参数 3.1 > 形参与实参函数在定义阶段括号内写的参数,,我们称之为’形式参数’ 简称为>>>:形参。函数在调用阶段括号内写的参数,我们称之为’实际参数’ 简称为>>>:实参。
形参类似于就是变量名、实参类似于是变量的值。在调用函数的时候传入实参,会与形参临时绑定,在函数运行结束之后自动解除绑定。例如:
def index(a, b): # 这里的就是indea函数的形参 print(a, b) index(1, 2) # 1,2是就是indea函数的实参 # 打印 1, 2 ''' 这里1会临时绑定给形参a,2会临时绑定给形参b 函数体代码运行期间 可以通过形参直接使用到实参 函数体代码运行完毕之后 解除绑定 形参ab处于没有绑定值得状态 等待下一次函数调用传入实参进行绑定 '''3.2 > 位置参数
调用函数时,编译器会将函数的实际参数位置顺序依此传递给形式参数,即将第1个实际参数传递给第1个形式参数,将第2个实际参数传递给第2个形式参数,依此类推。
定义一个计算两数之商的函数division(),具体代码如下:
def division(num_one, num_two): print(num_one / num_two)
使用以下代码调用division()函数:
division(6, 2) # 位置参数传递
上述代码调用division()函数时传入实际参数6和2,根据实际参数和形式参数的位置关系,6被传递给形式参数num_one,2被传递给形式参数num_two,如上图。
使用位置参数传值时,如果函数中存在多个参数,记住每个参数的位置及其含义并不是一件容易的事,此时可以使用关键字参数进行传递。关键字参数传递通过"形式参数=实际参数"的格式将实际参数与形式参数相关联,根据形式参数的名称进行参数传递。
假设当前有一个函数info(),该函数包含3个形式参数,具体代码如下:
def info(name, age, address):
print(f'姓名:{name}')
print(f'年龄:{age}')
print(f'地址:{address}')
当调用info()函数时,通过关键字为不同的形式参数传值,具体代码如下:
info(name = 'bob', age = 23, address = '上海')
运行结果:
姓名:bob 年龄:23 地址:上海3.3 > 默认参数
定义函数时可以指定形式参数的默认值,调用函数时,若没有给带有默认值的形式参数传值,则直接使用参数的默认值;若给带有默认值的形式参数传值,则实际参数的值会覆盖默认值。
定义一个包含参数ip与port的函数conner(),为形式参数port指定默认值3306,代码如下:
def conner(ip, prot=3306):
print(f'连接地址为:{ip}')
print(f'连接端口号为:{port}')
print('连接成功')
通过以下两种方式调用conner()函数:
conner('127.0.0.1') # 第一种,形式参数使用默认值
-------------------------------------------------------------------------------
conner(ip = '127.0.0.1', port = 8080) #第二种,形式参数使用传入值
程序运行结果
连接地址:127.0.0.1 连接端口号:3306 连接成功 ------------------------------------------------------------------------------- 连接地址:127.0.0.1 连接端口号:8080 连接成功
分析以上输出结果可知,使用第一种方式调用conner()函数时,参数port使用的默认值是3306;使用第二种方式调用conner()函数时,参数port使用实际参数的值8080。
注意!!!
若函数中包含默认参数,调用该函数时默认参数应在其他实参之后。
若要传入函数中的参数个数不确定,可以使用不定长参数也称可变参数,此种参数接收参数的数量可以任意改变。包含可变参数的函数的语法格式如下:
def 函数名([formal_args,] *args, **kwargs): ["函数文档字符串"] 函数体 [return语句]
以上语法格式中的参数 *args 和参数 **kwargs都是不定长参数,这两个参数可以搭配使用,亦可单独使用。下面分别介绍。
3.4.1 > *args不定长参数*args用于收不定数量的位置参数,调用函数时传入的所有参数被 args接收后以元组的形式保存。定义一个包含参数args的函数,代码如下:
def test(*args): print(args)
调用以上函数,传入任意个参数,代码如下:
test(1, 2, 3, 'a', 'b', 'c')
程序运行结果
(1, 2, 3, 'a', 'b', 'c')3.4.1 > **kwargs
不定长参数 kwargs 用于接收不定数量的关键字参数,调用函数时传入的所有参数开挖如果是接收后以字典形式保存。定义一个包含参数**kwargs的函数,代码如下:
def test(**kwargs): print(kwargs)
调用以上函数,传入任意个关键字,代码如下:
test(a = 1, b = 2, c = 3, d = 4)
程序运行结果
('c' : 3, 'b': 4, 'a':1, 'b': 2)
3.5 > 可变长参数
定义函数的时候 如果不确定这个函数将来需要多个实参 那么可以采用下述的方法,例如永固接收用户信息的func()函数:
def func(*a,**k):
print(a,k)
func() # () {}
func(1,2,3,4,name='jason',age=18) # (1, 2, 3, 4) {'name': 'jason', 'age': 18}



