函数
定义函数的定义
函数代码块以 def 关键词开头,后接函数标识符名称和小括号 ()。
任何传入参数和自变量必须放在小括号中间,小括号之间可以用于定义参数。
函数内容以冒号 : 起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
函数的参数
位置参数
:调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致
def fun(a, b ,c):
print(a)
print(b)
print(c)
fun(1,2,3)
关键字参数
def printme( str ):
"打印任何传入的字符串"
print (str)
#调用printme函数
printme( str = "逻辑教育")
- 混合使⽤位置参数和关键字参数时,位置参数必须在关键字参数前⾯
def fun(a, b ,c):
print(a)
print(b)
print(c)
fun(1,c=3,b=2)
不定长参数
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vartuple)
# 调用printinfo 函数
printinfo( 70, 60, 50 )
#以上实例输出结果:
输出:
70
(60, 50)
加了两个星号 ** 的参数会以字典的形式导入
def printinfo( arg1, **vardict ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vardict)
# 调用printinfo 函数
printinfo(1, a=2,b=3)
#以上实例输出结果:
输出:
1
{'a': 2, 'b': 3}
- 如果单独出现星号 * 后的参数必须用关键字传入
def f(a,b,*,c):
return a+b+c
f(1,2,3) # 报错
f(1,2,c=3) # 正常
关于各类形参的排列顺序:位置参数,* 参数(只接受位置参数,不接受关键字参数), 关键字参数,* *参数(只有一个)
参数的解包
- 传递实参时,也可以在序列类型的参数前添加星号,序列中元素会依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数⼀致
def test(p1,p2):
print(p1,p2)
test(10,20) #正常调用
nums = [10, 20] #非正常调用:列表解包
test(*nums) # test(*nums) -> test(10, 20)
# 列表参数前面添加一个*符号,表示将列表拆分成一个一个独立的数据传递
# 非正常调用:字典解包
#字典参数前面添加两个**
nums2 = {"p1": 100, "p2": 200}
test(**nums2) # test(**nums2)-> test(p1=100, p2=200)
作业
1.打印名片程序:输入姓名,电话号码,性别,最后打印出来名片:
控制姓名长度为6-20
电话号码长度11
性别只能允许输入男或女
每一样信息不允许为空
def card():
a=input('姓名:')
b=input('电话:')
c=input('性别:')
if len(a) < 6 or len(a) > 20:
a=input('姓名:')
if len(b) != 11 or b.isdigit == False:
b=input('电话:')
if c not in ['男','女']:
c=input('性别:')
print('名片:')
print('姓名:',a)
print('电话:',b)
print('性别:',c)
card()
2.使用函数求前20个斐波那契数列
斐波那契数列:1,1,2,3,5,8,13,21…
即: 起始两项均为1,此后的项分别为前两项之和
def num(counts):
a, b, c = 1, 1, 0
while c < counts:
print(a, end=' ')
a, b = b, a+b
c += 1
print()
num(20)
3.定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
def sum():
a = 0
for i in range(1,101):
a += i
print(a)
sum()