函数
案例:取小数点后两位
a = 3.141592654
result = round(a,2)
print(result)
输出:3.14
2.查看内置函数的功能
使用help()函数查看
比如:help(print)
查看python之禅:import this
3.函数的基本结构:
def funcname(parameter_list):
pass
说明:1.参数列表可以没有 2.return value 如果没有返回值则默认返回None
案例:使用函数实现两个数相加 和 实现一个打印函数
import sys
sys.setrecursionlimit(10000) #设置递归调用的最大限制,默认是900多次(拓展部分在写算法时经常用到)
def add(a,b):
return a+b
def print_result(code):
print(code)
a = add(1,2)
b = print_result('我是一个打印函数')
print(a,b)
结果:
我是一个打印函数
3 None
解释函数执行流程:1.执行到b变量的赋值时调用了打印函数故打印出‘我是一个打印函数’ 2. 输出None是因为打印函数没有返回值故默认为None
小提示:
1.如果函数中只有一个return语句,则return后面的语句不再执行
2.函数可以返回任意类型的值
4.如何让函数返回多个结果
案例:
def test(a,b):
res1 = a * 5
res2 = b *2 +6
return res1,res2
result = test(6,8)
print(type(result))
输出结果:<class 'tuple'>
解释:返回结果可以是元组、列表等,默认是元组
如何使用返回的结果:
res1_a,res2_b = test(6,8)
print(res1_a,res2_b)
输出结果:30 22
5.序列解包与链式赋值
赋值:
a = 1
b = 2 <=> a,b,c = 1,2,3 (等价)
c = 3
多个值可以赋值给一个变量,比如:
d = 1,2,3
print(type(d))
输出结果:<class 'tuple'>
序列解包:
a,b,c = d
规则:左右个数相同
案例1:
d = 1,2,3
a,b,c = d
print(b)
输出:2
案例2:
a = 1
b = 1 <=> a,b,c = 1,1,1 <=> a=b=c=1
c = 1
print(a,b,c) --> 1 1 1
6.必须参数与关键字参数
参数类型:
(1)必须参数
例如:
def add(a,b):#a,b是形参(形式参数)
print(code)
a = add(1,2)#1,2是实参(实际参数)
b = print_result('我是一个打印函数')
(2)关键字参数
例如:
def add(a,b):
return a+b
a = add(b=1,a=2) #关键字参数(不关心形参的顺序,增强代码可读性)
小提示:实参与形参的个数相同
(3)默认参数
例如:
def student_list(name,gender='男',age=18,college='无名中学'):
print('我是'+name)
print("我今年"+ str(age) + '岁')
print('我是' +gender + '生')
print('我在' + college + '上学')
student_list('小明','男',16,'无名路中学')
print('--------------------------')
student_list('小江')
print('--------------------------')
student_list('小红','女',16)
结果:
我是小明
我今年16岁
我是男生
我在无名路中学上学
--------------------------
我是小江
我今年18岁
我是男生
我在无名中学上学
--------------------------
我是小红
我今年16岁
我是女生
我在无名中学上学
作用:确保函数调用的参数完整性
规则:1.给参数设定默认值 2.如果参数没有默认值,则为必传参数 3.若要改变默认参数则直接传入相应的参数即可
一些误点总结:
1.必须把非默认参数放到默认参数后边
2.形参列表和实参列表是一一对应的(默认情况下),若要改变指定的参数则需使用关键字参数指定需要改变的参数(关键 字参数可改变传参顺序)
3.默认参数不能和必须参数混合调用(遵循第一条规则)
比如:
def student_list(name,gender='男',age=18,college='无名中学'):
print('我是'+name)
print("我今年"+ str(age) + '岁')
print('我是' +gender + '生')
print('我在' + college + '上学')
student_list('小明','男',16,'无名路中学')
print('--------------------------')
student_list('小江')
print('--------------------------')
student_list('小红','女',16)
print('--------------------------')
student_list('小兰',college='知名中学',16,gender='女')#报错位置
结果:SyntaxError: positional argument follows keyword argument
例1:
def demo(*param):
print(param)
print(type(param))
demo(1,2,3,4,5,6,7,8)
结果:
(1, 2, 3, 4, 5, 6, 7, 8)
<class 'tuple'>
例2:
def demo(*param):
print(param)
print(type(param))
a = (1,2,3,4,5,6,7,8)
demo(*a)
结果:
(1, 2, 3, 4, 5, 6, 7, 8)
<class 'tuple'>
场景:使用列表或者元组等作为参数
*a的作用:解包
误点:如果直接传入将返回一个二维元组
例3:(必需参数、默认参数和可变参数的调用顺序)
def demo(param1,param2=2,*param):
print(param1)
print(param2)
print(param)
demo('a',1,2,3)
结果:a 1 (2, 3)
例4:
def demo(param1,*param,param2=2):
print(param1)
print(param)
print(param2)
demo('a',1,2,3,'param')
结果:a (1, 2, 3, 'param') 2
例5:
def demo(param1, *param, param2=2):
print(param1)
print(param)
print(param2)
demo('a',1,2,3,param2='param')
结果:a (1, 2, 3) param
例6:(求平方和)
def sqrsum(*param):
sum = 0
for i in param:
sum += i*i
print(sum)
a = (1,2,3,4,5)
sqrsum(*a)
结果:55
(5)关键字可变参数
例1:
def demo(**param):
print(param)
print(type(param))
demo(key1='a',key2='b',key3='c')
结果:
{'key2': 'b', 'key1': 'a', 'key3': 'c'}
<class 'dict'>
例2:
def demo(**param):
for key,value in param.items():
print(key,':',value)
demo(key1='a',key2='b',key3='c')
结果:
key3 : c
key2 : b
key1 : a
例3:
def demo(**param):
for key,value in param.items():
print(key,':',value)
a = {'key1':'a','key2':'b','key3':'c'}
demo(**a)
结果:
key3 : c
key1 : a
key2 : b
小提示:可变参数列表可以什么都不传
7.变量作用域
例1:
a = 10 #全局变量
def add(x,y):
a = x + y #局部变量
print(a)
add(1,2)
print(a)
结果:3 10
原因:a的作用范围不同
例2:
def demo():
a = 10
for i in range(0,9):
b = '局部变量测试'
a += i
print(a)
print(b)
demo()
结果:46 局部变量测试
原因:能打印出for循环里的b变量是因为for循环不形成块级作用域
例3:
a = 1
def func1():
a = 2
def func2():
a = 3
print(a)
func2()
func1()
结果:3
小提示:局部变量具有相对性,具有作用域链的特性,逐级往上找
8. global关键字(将局部变量定义为全局变量)
例1:
def demo():
global c #先定义c为全局变量
c = 2 #使用c
demo() #调用函数使全局变量生效
print(c)
结果:2
小提示:外部模块调用也可以使用global定义的全局变量
特点:(1)功能性(2)隐藏细节 (3)避免编写重复的代码
1.内置函数round()案例:取小数点后两位
a = 3.141592654
result = round(a,2)
print(result)
输出:3.14
2.查看内置函数的功能
使用help()函数查看
比如:help(print)
查看python之禅:import this
3.函数的基本结构:
def funcname(parameter_list):
pass
说明:1.参数列表可以没有 2.return value 如果没有返回值则默认返回None
案例:使用函数实现两个数相加 和 实现一个打印函数
import sys
sys.setrecursionlimit(10000) #设置递归调用的最大限制,默认是900多次(拓展部分在写算法时经常用到)
def add(a,b):
return a+b
def print_result(code):
print(code)
a = add(1,2)
b = print_result('我是一个打印函数')
print(a,b)
结果:
我是一个打印函数
3 None
解释函数执行流程:1.执行到b变量的赋值时调用了打印函数故打印出‘我是一个打印函数’ 2. 输出None是因为打印函数没有返回值故默认为None
小提示:
1.如果函数中只有一个return语句,则return后面的语句不再执行
2.函数可以返回任意类型的值
4.如何让函数返回多个结果
案例:
def test(a,b):
res1 = a * 5
res2 = b *2 +6
return res1,res2
result = test(6,8)
print(type(result))
输出结果:<class 'tuple'>
解释:返回结果可以是元组、列表等,默认是元组
如何使用返回的结果:
res1_a,res2_b = test(6,8)
print(res1_a,res2_b)
输出结果:30 22
5.序列解包与链式赋值
赋值:
a = 1
b = 2 <=> a,b,c = 1,2,3 (等价)
c = 3
多个值可以赋值给一个变量,比如:
d = 1,2,3
print(type(d))
输出结果:<class 'tuple'>
序列解包:
a,b,c = d
规则:左右个数相同
案例1:
d = 1,2,3
a,b,c = d
print(b)
输出:2
案例2:
a = 1
b = 1 <=> a,b,c = 1,1,1 <=> a=b=c=1
c = 1
print(a,b,c) --> 1 1 1
6.必须参数与关键字参数
参数类型:
(1)必须参数
例如:
def add(a,b):#a,b是形参(形式参数)
return a+b
def print_result(code):print(code)
a = add(1,2)#1,2是实参(实际参数)
b = print_result('我是一个打印函数')
(2)关键字参数
例如:
def add(a,b):
return a+b
a = add(b=1,a=2) #关键字参数(不关心形参的顺序,增强代码可读性)
小提示:实参与形参的个数相同
(3)默认参数
例如:
def student_list(name,gender='男',age=18,college='无名中学'):
print('我是'+name)
print("我今年"+ str(age) + '岁')
print('我是' +gender + '生')
print('我在' + college + '上学')
student_list('小明','男',16,'无名路中学')
print('--------------------------')
student_list('小江')
print('--------------------------')
student_list('小红','女',16)
结果:
我是小明
我今年16岁
我是男生
我在无名路中学上学
--------------------------
我是小江
我今年18岁
我是男生
我在无名中学上学
--------------------------
我是小红
我今年16岁
我是女生
我在无名中学上学
作用:确保函数调用的参数完整性
规则:1.给参数设定默认值 2.如果参数没有默认值,则为必传参数 3.若要改变默认参数则直接传入相应的参数即可
一些误点总结:
1.必须把非默认参数放到默认参数后边
2.形参列表和实参列表是一一对应的(默认情况下),若要改变指定的参数则需使用关键字参数指定需要改变的参数(关键 字参数可改变传参顺序)
3.默认参数不能和必须参数混合调用(遵循第一条规则)
比如:
def student_list(name,gender='男',age=18,college='无名中学'):
print('我是'+name)
print("我今年"+ str(age) + '岁')
print('我是' +gender + '生')
print('我在' + college + '上学')
student_list('小明','男',16,'无名路中学')
print('--------------------------')
student_list('小江')
print('--------------------------')
student_list('小红','女',16)
print('--------------------------')
student_list('小兰',college='知名中学',16,gender='女')#报错位置
结果:SyntaxError: positional argument follows keyword argument
(4)可变参数
特点:用*标识为可变参数列表例1:
def demo(*param):
print(param)
print(type(param))
demo(1,2,3,4,5,6,7,8)
结果:
(1, 2, 3, 4, 5, 6, 7, 8)
<class 'tuple'>
例2:
def demo(*param):
print(param)
print(type(param))
a = (1,2,3,4,5,6,7,8)
demo(*a)
结果:
(1, 2, 3, 4, 5, 6, 7, 8)
<class 'tuple'>
场景:使用列表或者元组等作为参数
*a的作用:解包
误点:如果直接传入将返回一个二维元组
例3:(必需参数、默认参数和可变参数的调用顺序)
def demo(param1,param2=2,*param):
print(param1)
print(param2)
print(param)
demo('a',1,2,3)
结果:a 1 (2, 3)
例4:
def demo(param1,*param,param2=2):
print(param1)
print(param)
print(param2)
demo('a',1,2,3,'param')
结果:a (1, 2, 3, 'param') 2
例5:
def demo(param1, *param, param2=2):
print(param1)
print(param)
print(param2)
demo('a',1,2,3,param2='param')
结果:a (1, 2, 3) param
例6:(求平方和)
def sqrsum(*param):
sum = 0
for i in param:
sum += i*i
print(sum)
a = (1,2,3,4,5)
sqrsum(*a)
结果:55
(5)关键字可变参数
例1:
def demo(**param):
print(param)
print(type(param))
demo(key1='a',key2='b',key3='c')
结果:
{'key2': 'b', 'key1': 'a', 'key3': 'c'}
<class 'dict'>
例2:
def demo(**param):
for key,value in param.items():
print(key,':',value)
demo(key1='a',key2='b',key3='c')
结果:
key3 : c
key2 : b
key1 : a
例3:
def demo(**param):
for key,value in param.items():
print(key,':',value)
a = {'key1':'a','key2':'b','key3':'c'}
demo(**a)
结果:
key3 : c
key1 : a
key2 : b
小提示:可变参数列表可以什么都不传
7.变量作用域
例1:
a = 10 #全局变量
def add(x,y):
a = x + y #局部变量
print(a)
add(1,2)
print(a)
结果:3 10
原因:a的作用范围不同
例2:
def demo():
a = 10
for i in range(0,9):
b = '局部变量测试'
a += i
print(a)
print(b)
demo()
结果:46 局部变量测试
原因:能打印出for循环里的b变量是因为for循环不形成块级作用域
例3:
a = 1
def func1():
a = 2
def func2():
a = 3
print(a)
func2()
func1()
结果:3
小提示:局部变量具有相对性,具有作用域链的特性,逐级往上找
8. global关键字(将局部变量定义为全局变量)
例1:
def demo():
global c #先定义c为全局变量
c = 2 #使用c
demo() #调用函数使全局变量生效
print(c)
结果:2
小提示:外部模块调用也可以使用global定义的全局变量