定义一个函数

  • def 关键字开头,接函数标识名和圆括号 ()
  • 参数和自变量必须放入圆括号
  • 函数第一行可以选择使用文档字符串存放函数说明
  • 函数内容以冒号起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值。不带返回值相当于返回None。
def hello():
    """这是一个打印HelloWord的函数"""
    print('Hello World')
    return


hello()
Hello World

参数传递

可变与不可变对象

字符串、元组和数字是不可变对象列表,字典和集合是可变对象。、

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。当python 传递参数时也是遵行的这种原则。

通过 id() 函数来查看内存地址变化:

def change(a):
    print(id(a))   # 指向的是同一个对象
    a=10
    print(id(a))   # 一个新对象
    return
 
a=1
print(id(a))
change(a)
4379369136
4379369136
4379369424
  • 可变类型:变量赋值list1=[1,2,3]再赋值list[2]=5则可以直接修改变量的值。当传递参数时也如此。
def change(list1):  # 注意最好不和外部参数名重复
    """修改可变对象"""
    list1.extend([4, 5, 6])


list_1 = [1, 2, 3]
change(list_1)
print(list_1)
[1, 2, 3, 4, 5, 6]

参数

参数类型:

  • 必须参数
  • 关键字参数
  • 默认参数
  • 不定长参数
  • 强制位置参数

必须参数

必须参数必须以正确的顺序传入函数。调用时数量必须和声明的一样。

def print_str(str1):
    print(str1)
    return


print_str('Hello World!')
str_2 = '你好'
print_str(str_2)
Hello World!
你好

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数确定传入的参数值。

关键字参数允许函数调用参数的顺序和声明时不一样

def print_str(name, age):
    print('name:%s' % name)
    print('age:%d' % age)


print_str(age=18, name='Job')
name:Job
age:18

默认参数

调用参数时,如果没有传入就会设置为默认。

def print_str(name, age=10):
    print('姓名:', name)
    print('年龄:', age)
    return


print_str('Bob', 19)
print_str('Jack')
姓名: Bob
年龄: 19
姓名: Jack
年龄: 10

不定长参数

可以处理比申明时更多的参数。方法为将参数前面加星号。加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

def print_str(name, age, *var_tuple):
    print('姓名:', name)
    print('年龄:', age)
    print(var_tuple)
    return


print_str('Bob', 19)
print_str('Jack', 12, 'male', 'China')
姓名: Bob
年龄: 19
()
姓名: Jack
年龄: 12
('male', 'China')

加了两个星号 ** 的参数会以字典的形式导入。

def print_str(name, age, **var_dic):
    print('姓名:', name)
    print('年龄:', age)
    print(var_dic)
    return


print_str('Bob', 19)
print_str('Jack', 12, gender='male', country='China')
姓名: Bob
年龄: 19
{}
姓名: Jack
年龄: 12
{'gender': 'male', 'country': 'China'}

强制位置参数

python3.8新增。用于指明函数形参必须使用指定位置参数。

下列实例中,形参a,b必须使用指定位置参数,cd可以是位置形参或者关键字形参,而ef要求为关键字形参

def func(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)


# 正确调用方法
func(1, 2, 3, d=4, e=5, f=6)
1 2 3 4 5 6

匿名函数

python 使用lambda 来创建匿名函数。
所谓匿名就是指不再使用def 这样的标准形式定义来创建一个函数。

  • lambda 只是一个表达式,函数体比def 简单很多
  • lambda 的主体是一个表达式而不是一个代码块。仅能在lambda 表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,并且不能访问自己参数列表之外或全局空间里的参数。
  • 虽然lambda 函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
sumfunc = lambda num1, num2: num1 + num2

print(sumfunc(1, 2))
3

return

return [表达式]用于退出函数,选择性地向调用方法返回一个表达式。不带参数的return语句返回none。

def sum_func(num1, num2):
    return num1 + num2


print(sum_func(1, 2))
3