目录
函数的定义与调用
特点
语法格式
函数的参数
函数的返回值
函数嵌套调用
变量的作用域
局部变量
全局变量
函数的多种参数
位置参数
关键字参数
默认参数
可变参数
函数的定义与调用
python函数需要使用def关键字来定义,需要先定义,后调用
特点:
- 先定义,后调用
- 不调用,不执行
- 调用一次,执行一次
语法格式
# 定义函数
def 函数名():
代码1
...
# 调用函数
函数名()
例
编写一个show()函数,并在函数中输出:bug虐我千百遍, 我待bug如初恋。
def show():print("bug虐我千百遍, 我待bug如初恋。")show()
函数的参数
当在定义函数时,设定了参数,则可称该函数为:有参函数。反之,没有参数的函数,称为:无参函数。
(1)形参是指形式参数,表示在定义函数时的参数;
(2)实参是指实际参数,表示在调用函数时传递的参数值,具有实际意义。
有参函数
def 函数名(参数1,参数2,...): # 形参
代码1
代码2
...函数名(参数值1,参数值2,...) # 实参
例
定义一个函数,用于求解两个数之和;
def sum_num(a,b):sum = a + bprint(f"两个数的和:{sum}")sum_num(2,4) # 6
sum_num(7,4) # 11
函数的返回值
函数的返回值指的是:当函数完成一件事情后,最后要返回给函数的结果。
def 函数名([参数1, 参数2, ...]):
代码1
代码2
...
return 值...
print(函数名(实参,实参,...))
注:
(1)若要给函数返回结果,需要使用return关键字;
(2)return关键字的作用:把结果返回给函数;结束函数;
(3)当函数没有返回值时,默认返回None。
例
(1)定义一个函数1,用于求解两个数之积,并把积返回给函数;
(2)定义一个函数2,用于求解两个数的差、和,并同时返回给函数;
(3)定义一个函数3,输出:人生苦短,我用Python;
# 1.求解两个数的积
def func1(a,b):return a*bprint(func1(3,5)) # 15# 2.求解两个数的差,和
def func2(x,y):return x-y,x+yprint(func2(8,5)) # (3,13) 输出的是一个元组# 3.输出没有返回值
def show():print("人生苦短,我用Python。")show() # 人生苦短,我用Python。
print(show()) # None
函数嵌套调用
def 函数1():
代码
...def 函数2():
代码
# 调用函数1
函数1()
...
例1:
(1)先定义一个test()函数和func()函数;
(2)接着,在函数test()中,嵌套调用func()函数,并在外部调用test()函数;
(3)执行程序,观察效果;
# 1.定义func()
def func():print("==========AA===============")print("==========Nfunc()============")print("==========BB===============")# 2.定义test()、调用func()
def test():print("*************11****************")func()print("**********M调用了test方法**************")print("*************22****************")# 3.调用test()
test()
例2:
(1)要完成一个输出任意条横线的需求;
(2)定义函数1:用于输出一条横线;
(3)定义函数2:先循环N次,再调用函数1,可输出N条横线;
def print_one_line():print("-"*40)def print_lines(num):i = 0while i < num:print_one_line()i += 1print_lines(10)
变量的作用域
局部变量
局部变量指的是:定义在函数内部的变量或参数,且只在函数中生效。
def 函数名(参数1,参数2,...):
代码
变量名 = 值
...
例
(1)定义一个函数1,有局部变量:参数;
(2)定义一个函数2,有局部变量:变量;
(3)调用函数,观察程序执行效果。
# 1.参数
def func1(a):print(f"a值为:{a}")func1(2)def func2():b=100 # 局部变量print(f"===========b的值 = {b}")func2()
print(b) # 报错
全局变量
全局变量指的是:在函数体内、外都能生效的变量。
变量名 = 值
def 函数名():
代码
...
注意:想要修改全局变量的值时,记得提前使用global进行声明.
# 声明
global 变量名
# 修改值
变量名 = 修改后的值
例
(1)定义一个全局变量1,并在函数内外都使用;
(2)定义一个同名的全局变量2和局部变量,并在函数内使用该同名变量;
# 1.定义全局变量
a = 100
print(a)def func():print(f"输出的变量:{a}")func()# 3.定义同名变量
age = 18def show():age = 34print(f"输出age的值为:{age}")show()
print(f"age = {age}")
注意:当全局变量和局部变量设置的变量名相同,优先输出全局变量
函数的多种参数
位置参数
调用函数时,根据函数定义的参数位置来传递数值。
def 函数名(参数1,参数2,...):
代码
...函数名(值1,值2,...)
例
(1)定义使用格式化符号替换数据,显示法名,技能,年龄
def show_info(name, skill, age):print("-" * 50)print("法名: %s"%name)print("技能: %s"%skill)print("年龄: %d"%age)print("-" * 50)# 2 关键字参数 关注点: 值找到对应的参数名就可以, 跟顺序无关(参数多时 比较适合)
# show_info(skill="好色", age=888, name="八戒")
# show_info(age=888) # 报错: 缺少两个参数 name, skill# 1 位置参数 关注点: 参数 个数, 类型, 顺序(缺点: 必须按照指定顺序来)
show_info("悟空", "七十二绝技", 666)
# show_info("悟空", 72, "666") # 报错: 需要整数, 传递的字符串, 类型不一致
# show_info("悟空") # 报错: 缺少参数
注意:如果参数的个数不够,或者类型不对,将会报错
关键字参数
调用函数时,可以通过【键 = 值】的形式指定参数。
def 函数名(参数1,参数2,...):
代码
...函数名(参数1=值, 参数2=值,...)
例
定义一个函数,用于显示个人名片的姓名、年龄、性别等信息;
# 1.定义显示个人信息的函数
def show_infos(name, age, sex):print("个人信息如下:")print(f"姓名:{name}")print(f"年龄:{age}")print(f"性别:{sex}")# 2.调用
show_infos(age=24,name="张三",sex="女")
# show_infos(age=24,name="张三",gender="女") # 报错
默认参数
在定义函数时,就为参数提供默认值。
def 函数名(参数1,参数2,...,参数n=值):
代码
...函数名(值1,值2,...[值n])
例
定义一个显示姓名,电话,密码的函数,且默认性别为男;
def emp(name, phone, password="123456"):print("-" * 50)print(f"个人信息: name={name}, phone={phone}, password={password}")print("-" * 50)# emp("悟空", "18612480001", password="baqi")
emp("八戒", "18612480001")# 报错: 设置默认参数 必须参数的最后
# def emp(password="123456", name, phone):
# print("-" * 50)
# print(f"个人信息: name={name}, phone={phone}, password={password}")
# print("-" * 50)# 报错: 设置默认参数 必须参数的最后
# def emp(name="悟净", phone, password="123456"):
# print("-" * 50)
# print(f"个人信息: name={name}, phone={phone}, password={password}")
# print("-" * 50)
注意:定义默认参数必须放在最后的位置,并且打印时也不可以换位置
可变参数
可变参数也叫不定长参数,不定长参数用于在不确定调用函数时,要传递多少个参数的场景,当然也可以不传递参数。
而当要调用函数时,可以给*args传递位置参数,给**kwargs传递关键字参数,这样显得更加方便。
def 函数名(参数1,..,*args,**kwargs):
代码
...
函数名(值1, 值2, 值3, ... 参数1=值, 参数2=值,...)
例
(1)定义函数1,使用不定长参数*args求多个数之和;
(2)定义函数2,使用不定长参数**kwargs求多个数之和;
(3)综合两个函数,合并在一起完成求多个数之和;
# 1.通过*args求和
def num1(*args):print(args)sum1 = 0for i in args:sum1 += iprint(f"多个数之和为:{sum1}")num1(1,2) # 3
num1(1,2,9) # 12
num1(1,2,9,11) # 23# 2.通过**kwargs之和
def num2(**kwargs):print(kwargs)sum2 = 0for i in kwargs.values():sum2 += iprint(f"多个数之和为:{sum2}")num2(a=1,b=2) # 3
num2(a=1,b=2,c=4) # 7
num2(a=1,b=2,c=3,d=9) # 15# 3.结合
def num3(*args,**kwargs):result = 0sum1 = 0for i in args:sum1 += isum2 = 0for i in kwargs.values():sum2 += iresult = sum1 + sum2print(f"多个数之和为:{result}")num3(3, a=1, b=2, c=4) # 10
num3(3,6, a=1, b=2, c=4) # 16
num3(3,6, a=1, b=2, c=4,f=9) # 25