python基础语法之函数
一、描述
- 作用:将面向过程的代码变得模块化,能够实现重复调用
- input(输入函数)、print(输出函数)、type()等
二、案例
-
- 先计算1~100的和
sum = 0
for i in range(1, 101):
sum += i
- 2.在计算1~1000的和
sum = 0
for i in range(1, 1001):
sum += i
三、函数的语法
- 使用def关键字定义函数,def后面跟函数名(本质:变量)、圆括号和冒号。
- 圆括号中放形参**(形参是向函数内部传参的变量)。**
- 函数内部代码块通常第一行写多行注释,作为解释函数作用的注释。
- 代码块结束以后,使用return将函数内部产生的结果返回到函数外部
- 函数定义完,使用函数时叫做调用函数,如何调用?函数名后面跟圆括号
- 调用函数时需要在圆括号中写实参传递给形参。
四、自定义计算start到end的和函数
def rangeSum(start, end):
"""计算某个范围的和"""
sum = 0
for i in range(start, end + 1):
sum += i
# print(sum)
return sum
# 调用函数
print(rangeSum(1, 100))
print(rangeSum(1, 1001))
- 函数可以降低代码的冗余度,也可以给代码阅读者更清晰的思路(一个函数代表一个功能)。
五、return函数
-
作用:
- 能够将函数内部产生的结果返回到函数外部。
- 能够结束函数的执行。
-
练习:将判断一个年份是否是闰年的代码封装成函数。
def isLeapYear(year):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return '闰年'
else:
return '平年'
# for i in range(1, 2023):
# print(isLeapYear(i)) # 打印1-2022年之间所有的闰年
print(isLeapYear(2008))
总结:封装函数(自定义函数)在不改变原有代码执行逻辑、顺序的基础上做封装。
六、 函数执行的顺序
- 从调用函数开始执行,函数定义时,程序不参与执行。
函数的参数
一、默认值参数
- 自定义一个函数,函数的功能是计算某个范围中整数的和,默认计算1~100的和,或者也可以自定义范围计算和。
def rangeSum(start=1, end=100):
sum = 0
for i in range(start, end + 1):
sum += i
return sum
print(rangeSum())
print(rangeSum(200, 1000))
二、 位置参数
- 形参和实参之间的顺序需要一一对应。
print(rangeSum(100, 1000))
print(1, 2, 3, 4, sep=' ', end=' ')
print('|', '\t', 1, 2, 3, 4)
三、 关键字参数
- 形参和实参之间对应关系。
- 可以脱离顺序对应关系。
- 传递方式:调用函数是,rangeSum(形参1=值1, 形参2=值2)。
print(rangeSum(start=100, end=1000))
print(rangeSum(end=1000, start=100))
- 那个形参等于什么值相当于在调用函数时提前规定好。
四、 位置参数和关键字参数混用
- 位置参数必须在前面,关键字参数在后面。
def numSum(x, y, z):
print(f'x:{x} y:{y} z:{z}')
return x + y + z
print(numSum(10, 20, z=30))
print(numSum(10, z=50, y=20))
# print(numSum(z = 20, y = 10, 1)) -->语法错误,位置放错。
五、 不定长参数(带*号的变量)
- 不定长参数包含:*args, **kwargs
- 一个*的不定长参数必须放在两个**的不定长参数前面。
def selfTest(*args, **kwargs):
# pass不参与程序执行,仅仅是你保证代码结构的完整性
# pass
print(args, kwargs)
- 传参:
a. 一个*的不定长参数只能接收“位置参数”;
b. 两个**的不定长参数只能接收“关键字参数”。 - 为什么要使用不定长参数?
答:因为不定长参数可以一次性传入N个参数(N>0),可以解决实参和形参数量不一致的问题。
selfTest(1, 2, 3, 4, x=1, y=2, z=3)
- *args接收位置参数后将所有数据转换为一个元组。
- **kwargs接收胡关键字参数后将所有数据转换为一个字典。
六、 参数指定数据类型
- 给形参赋予一个默认值,默认值是什么数据类型等于传参的数据类型。
- 直接以“冒号数据类型(形参:int)”的形式创建形参。
- 在定义函数时使用“–>int”表明此函数返回什么数据类型。
def rangeSum(start=1, end=100) -> int:
sum = 0
for i in range(start, end + 1):
sum += i
return sum
rangeSum() # 报错,未传参
# rangeSum(1, 100)
# --------------------
def rangeSum(start: int, end: int) -> int:
sum = 0
for i in range(start, end + 1):
sum += i
return sum
rangeSum() # 报错,未传参
# rangeSum(1, 100)
全局变量和局部变量
一、 全局变量
- 从变量定义开始到程序结束,整个范围都是全局变量的作用域。
二、 局部变量
- 在函数或类中创建的变量,从函数或类中变量定义开始到函数或类结束,此范围是局部变量的作用域。
a = 0
def selfTest():
print(a)
b = 1
print(b)
selfTest()
print(a)
# print(b) # NameError: name 'b' is not defined
三、 局部变量的作用或意义?
- 局部变量创建于函数或类中,当函数或类被调用时局部变量才开始创建。
- 当函数或类结束时,局部百年来那个被销毁。
1.global 和 nonlocal
x = 100
def func1(x):
print(x) # 100
x = 0
print(x) # 0
func1(x)
print(x) # 100
2. global:在函数内部修改全局变量
- 语法:
global 全局变量
变量 = 值
y = 100
def func2():
global y
y = 666
func2()
print(y)
3.nonlocal:在函数A的函数B中修改函数A的变量
- 语法:
noncolal 局部变量
变量 = 值
def A():
z = 0
def B():
nonlocal z
z = 6
B()
print(z)
A()