一、函数
1、函数定义
Python中定义函数使用
def
关键字,函数结构如下:
def 函数名(参数):
函数体
return 语句
下面定义一个简单的函数,例如:
def display(param1, param2):
print('参数1:' + param1)
print('参数2:' + param2)
display("hello", "world")
2、传递实参
函数定义中可能包含多个形参,因此、函数调用也需要传递多个实参。向函数传递实参的方式有很多种,可以使用位置实参,这要求实参的顺序与形参的顺序相同;也可以使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典
2.1、位置实参
函数调用时,必须将函数调用中每个实参都关联到函数定义中的一个形参。最简单的关联方式是基于实参的顺序,这种关联方式称为位置实参,例如:
def display(param1, param2):
print('参数1:' + param1)
print('参数2:' + param2)
display("hello", "world")
display("world", "hello")
上面两个函数调用,因为传参的顺序不同,有不同的输出结果
2.2、关键字实参
关键字实参是传递给函数的名称对,例如:
def display(param1, param2):
print(param1 + " " + param2)
display(param1="hello", param2="world") # 输出结果:hello world
display(param2="world", param1="hello") # 输出结果:hello world
注意:使用关键字实参时,务必准确指定函数定义中的形参名
3、可更改(mutable)与不可更改(immutable)对象
strings、tuples 和 numbers 是不可更改的对象,而 list、dict 等则是可以修改的对象。
变量赋值
- 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a
- 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了
参数传递
- 不可变类型:类似 c++ 的值传递
- 可变类型:类似 c++ 的引用传递
注意:python中一切都是对象,严格意义不能说值传递还是引用传递,应该说传不可变对象和传可变对象。
下面是一个示例:
def param_test(obj):
obj += obj
print('形参值为:', obj)
print("*******值传递*****")
a = 'hello'
print('a的值为:', a)
param_test(a)
print('实参的值为:', a)
print("*******引用传递*****")
b = [1, 2, 3]
print('b的值为:', b)
param_test(b)
print('实参的值为:', b)
输出结果:
*******值传递*****
a的值为: hello
形参值为: hellohello
实参的值为: hello
*******引用传递*****
b的值为: [1, 2, 3]
形参值为: [1, 2, 3, 1, 2, 3]
实参的值为: [1, 2, 3, 1, 2, 3]
4、默认参数值
编写函数时,可以给函数形参指定默认值,例如:
def display(param1, param2="world"):
print(param1 + " " + param2)
display(param1="hello") # 输出结果:hello world
注意:使用默认值时,必须先在形参列表中列出没有默认值的形参,再列出有默认值的形参
5、返回值
函数可以不返回值,也可以返回一个或一组值,不带参数值的return语句返回None。下面定义一个函数,返回值是字典,例如:
def build_person(first_name, last_name):
person = {"first":first_name, "last":last_name}
return person
musician = build_person("jimi", "hendirx")
print(musician) # 输出结果:{'first': 'jimi', 'last': 'hendirx'}