目录
函数的定义
- 函数的概念,函数是一堆准备好的代码,在使用的时候调用即可
def printinfo():
print('hello')
printinfo()
函数的基本使用
- 定义函数
def 函数名():
pass - 调用函数
通过函数名调用,只要在调用时函数才会使用,执行到return函数结束
函数参数
- 实参 在函数声明的时候定义的参数,不确定,形式参数
- 形参 在函数调用的时候传入的参数
- 关键点:在函数定义阶段,函数中的参数为变量,在函数调用阶段则为运算的数据
# def 函数名(参数):
# 函数体
# 函数名(参数)
# 函数声明的时候的参数是形参 不确定的 形式参数
def tell_story(person, person1, story):
print('hello', person, person1, story)
tell_story(1, 2, 3)
# 在函数调用的时候传入参数, 实参
# 直接通过顺序传参
# 通过定义变量名的定义,按照顺序来对应
tell_story(person1=1, person=1, story=1)
函数的返回值
# 返回值 函数执行的结果,并不是所有的函数都有返回值
def add(a, b):
c = a + b
return c
result = add(1, 3)
print(result)
# 函数没有返回值 返回none
x = print('hello')
print(x)
函数的文档说明
# 函数的说明
def add(a, b):
'''
:param a:
:param b:
:return:
'''
c = a + b
return c
# help(add) 显示函数文档说明
help(add)
函数调用函数
- 在执行A函数内调用B函数时,只有执行完B函数之后才会继续在调用B的位置上执行A函数
def testB():
print('---- testB start----')
print('这里是testB函数执行的代码...(省略)...')
print('---- testB end----')
def testA():
print('---- testA start----')
testB()
print('---- testA end----')
testA()
函数的高级使用
局部变量和全局变量
局部变量
在函数内部定义的变量,在不同的函数可以定义名字相同的局部变量,各个不会产生影响,用来临时保存函数中定义的变量
全局变量
既可以在一个函数中使用,也可以在其他函数中使用
函数外部定义的变量为全局变量
# 可以使用一次global对多个全局变量进行声明
global a, b
# 还可以用多次global声明都是可以的
# global a
# global b
函数返回值
- return 返回函数值,结束函数,一个函数可以有return,但是只会返回第一个return的值
一个函数返回多个数值的方式
- 默认返回的值时数组,return返回的只要是可以存储多个数据的类型,那么就可以返回多个数据
def divid(a, b):
shang = a//b
yushu = a%b
return shang, yushu #默认是元组
result = divid(5, 2)
print(result) # 输出(2, 1)
def function():
# return [1, 2, 3] # [1, 2, 3]
# return (1, 2, 3) # (1, 2, 3)
return {"num1": 1, "num2": 2, "num3": 3} # {'num1': 1, 'num2': 2, 'num3': 3}
a = function()
print(a)
- 可以对返回的数据进行拆包(元组,字典,集合)
def get_my_info():
high = 178
weight = 100
age = 18
return high, weight, age # 函数返回三个数据,会自动打包为元组
# result = get_my_info() # result 接收到一个元组
# print(result)
my_high, my_weight, my_age = get_my_info() # 直接把元组拆分为三个变量来使用,更加方便
print(my_high)
print(my_weight)
print(my_age)
可变类型,不可变类型
- 可以修改的则为可变参数,反之为不可变类型
- 可变类型:列表,字典,文件,集合(修改之后内存地址不变)
- 不可变类型:字符串,元组,整数(修改之后内存地址改变)
函数参数
缺省参数
- 在函数参数(形参)中带有默认值的为缺省参数,必须要放在参数的末尾,否则会报错
- 函数在调用时候如果没有赋值则取默认值
def say_hello(name, age, city='wuhan'):
print("大家好,我是{},我今年{}岁,我来自{}".format(name, age, city))
'''
缺省参数 传递参数,使用默认的参数
如果没有传递参数会使用默认值
缺省参数要放在后面
'''
# 如果有位置参数和关键字参数,关键字参数一定要放在位置参数的后面 要不然会报错
say_hello('jerry', age='18', city='ll')
say_hello('张三', 18, city='jilin')
不定长参数(*args, **kwargs)
- *args存放所有未命名的函数参数,为元组
- ** kwargs 存放命名参数,形式为字典(key = values)
- 如果很多个不定值的参数,则缺省参数放在*args之后,**kwargs必须放在末尾
- 传入值时要注意* 号,如果没有的话默认为* args
def add(a, b, *args, **kwargs):
# c = a * kwargs
# 缺省参数要放在最后面
# return a + b + args
print(kwargs) # 多余的关键字会以字典的形式保存下来
# add(1, 2, 3)
add(1, 2, m=0, n=1)
def test(a, b, *args, **kwargs):
"函数在声明时,需要两个参数"
print('a={},b={},args={},kwargs={}'.format(a,b,args,kwargs))
test(2, 3, '你好', 'hi', 'how do you do', name="zhangsan", age=18)
# a=2,b=3,args=('你好', 'hi', 'how do you do'),kwargs={'name': 'zhangsan', 'age': 18}
b = ('hi', '大家好', '今天天气真好')
d = {'name': "zhangsan", "age": 19}
# 注意,在传入参数时的星号问题。
test(10, 20, *b, **d)
# a=10,b=20,args=('hi', '大家好', '今天天气真好'),kwargs={'name': 'zhangsan', 'age': 19}
# 如果在传值时,不使用星号,会把后面的参数当做 args
test(10,20,b,d)
# a=10,b=20,args=(('hi', '大家好', '今天天气真好'), {'name': 'zhangsan', 'age': 19}),kwargs={}