1.函数上
1.1函数简介
- 函数也是一个对象
注意:函数必须符合标识符命名规范(可以包含字母、数字和下划线_,但是不能以数字开头)
print —>是函数对象
print() —>是调用函数
# 1. 函数的创建
# 2. 函数的调用
# 3. 函数的参数
# 4. 函数的返回值
print() # 打印函数
# 函数的特点:
# 1. 函数中可以用来保存一些可执行的代码,在你需要的时候可以对这些代码进行多次的调用
# 2. 函数中保存的代码不会立即执行,需要调用函数的时候代码才会执行
# 语法
# def 函数名([形参1,形参2,形参3....]):
# 代码块
def fun(): # 自定义函数 fun是函数名,又可以称呼为函数对象
print('这是我的第一个函数')
fun() # 函数的调用
fun() # 函数的调用
fun() # 函数的调用
关键字的限制:
print=1
print(print)#TypeError: 'int' object is not callable ---->TypeError: int对象不可调用
1.2 函数的参数
1.2.1形参和实参
- 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但实际上不是赋值
- 实参(实际参数)指向形参,那么在函数调用时必须传递实参,实参会将其赋值给对应的形参。有几个形参就要有几个实参。
def pred(a):
a=b # UnboundLocalError: local variable 'b' referenced before assignment --->局部变量'b'在赋值之前引用(应当将引用的变量放置于使用前)
#正确输入:b=10
# a=b
b=10
k=b+4*2
print(b)
pred(a=0)
#执行结果:10
def pred(a):
b = 10
a=b
k=b+4*2
print(b)
pred(a)#NameError: name 'a' is not defined --->NameError: name 'a'没有定义(应当在调用时给予一个值。因为未通过实参给定义的形参赋值,而且该代码调用和定义均未给予一个值,等于一个死循环。)
#也可以这么写:
def pred(a):
a=b
print(a)
b=10#
pred(b)#
def fun(a):
a=B
a[0]=False
print(a,B,id(a),id(B))
# B=[1,2,4,5]
B=123#TypeError: int对象不支持项赋值(原因在于a[0]=False 这一行代码,a[0]这时值为int, 不再是列表)
fun(B)
1.2.2函数的传递方式
- 定义形参时,可以为形参指定默认值。指定默认值之后,如果用户传递了参数,则默认值不会生效。如果没有传递参数,默认值就会生效。
# 1. 位置传参 将对应位置上的实参赋值给对应位置上的形参
# def fun(a, b, c=20): # c=20 这个就是给c设置了一个默认值, 当设置了默认值之后,可以不传递这个参数的实参,那么这个时候这个参数的值就是这个默认值, 但是你如果传递了这个实参,那么就会覆盖掉这个默认值
# print(a)
# print(b)
# print(c)
#
#
# fun(1, 2, 3)
# 2. 关键字传参 可以不按照定义形参的顺序去传递实参,根据参数名进行传递参数
# def fun(a, b, c=20):
# print(a)
# print(b)
# print(c)
#
#
# fun(a=1, c=3, b=2)
# 位置传参和关键字传参的混合使用: 位置传参必须放到关键字传参的前面
# def fun(a, b, c=20):
# print(a)
# print(b)
# print(c)
#
#
# fun(1, b=2, c=3)
def fun(b, a, c=20):
print(a)
print(b)
print(c)
fun(2, a=1, c=3)
细节注意:
def purple(a,b,v):
print(a+b*v)
# purple(a=4,6,4)
# SyntaxError: positional argument follows keyword argument(位置传参必须放到关键字传参的后面)
def purple(a,b,v):
print(a+b*v)
#purple(6,4,a=4)
#TypeError: purple() got multiple values for argument 'a'(该次调用函数中,给a赋予了两个值,一个是6一个是4,6从位置传参而来,4是从关键字传参而来)
#正确书写
def purple(a,b,v):
print(a+b*v)
purple(6,4,v=4)
同上一样的代码,注意细节:
def purple(a,b,v=20):
print(a+b*v,v)
purple(6,4,v=4)#调用时,不论是位置传参还是关键字传参,用的值的对象在形参中已经被赋予了一个值,那么则调用的值直接覆盖定义。)
#运行结果为:22 4
1.3 不定长参数
def fun(a,b,v):
print(a+b+v)
fun(1,2,3,4)#TypeError: fun() takes 3 positional arguments but 4 were given --->TypeError: fun()接受3个位置参数,但给出了4个 ---->正确写法也可以使用不定长参数
- 定义函数时,可以在函数前加一个*,这样形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
def fun(c,b,*args):
print(*args)#交互界面呈现传递的参数值
print(args)#交互界面呈现元组形式
fun(2,342,34,4234,43534,234,23,423)
#运行结果:
34 4234 43534 234 23 423
(34, 4234, 43534, 234, 23, 423)
- 带*的实参只有一个,可以和其他参数配合使用
- *形参只能接收位置函数,不能接收关键字函数
- **形参可以接收其他的关键字函数,它会将这些关键字函数统一保存到字典当中。字典的key就是关键字函数的名字,字典的value就是参数的值
- **只能有一个,并且写在所有参数的后面
#正确写法1:def fun(c,*args,b=3) --->给关键字b 一个值
#正确写法2:def fun(c,b,*args): --->对*args的位置进行移动,移至所有参数的最后。
print(*args)
print(args)
r=0
fun(2,342,34,4234,43534,234,23,423)
# def fun(a, b, c):
# print(a + b + c)
#
# fun(1, 2, 3)
# 不定长参数: 不知道会接受几个实参,所以用不定长参数(形参)来接受实参
# def fun(c, *args, b):
# # *a就是不定长参数 当*a和位置传参混合使用的时候,位置参数一定要放到*a的前面
# # 当*a和关键字传参一起使用的时候,关键字传参要放到后面去
# # 顺序: 位置参数, *args, 关键字参数, **kwargs
# print(*args)
# print(args)
# r = 0
# for i in a:
# r += i
# print(r)
#
#
# fun(2, 3, 4, 5, b=1)
def fun(c, **kwargs):
# print(**a)
print(kwargs)
# r = 0
# for i in a:
# r += i
# print(r)
fun(2, b=1, d=2, e=3)
def fun1(*args, **kwargs): # 万能函数
pass
1.4参数的解包
- 打印名片程序:输入姓名,电话号码,性别,最后打印出来名片控制姓名⻓度为6-20电话号码⻓度11性别只能允许输入男或女每一样信息不允许为空
def program1(a,b,c):
a=input('请输入姓名:')
b=input('请输入电话号码:')
c=input('请输入性别:')
list1=['男','女']
if 6<=len(a)<=20:
print(a)
else:
print('名片控制姓名⻓度为6-20')
if len(b)==11:
print(b)
else:
print('电话号码⻓度11')
for i in list1:
if i in c :
print(c)
program1('','','')
- 使用函数求前20个斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21…即: 起始两项均为1,此后的项分别为前两项之和2.
def sum(a):
list=[1,1]
while len(list)<=a:
list.append(list[-1]+list[-2])
print('前',a,"的斐波那契数:", list)
sum(20)
- 编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
def num(a):
r=0
for i in range(a):
i+=1
r+=i
print(r)
num(100)