Python函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。它是对数据与代码的封装,实现了代码的复用。

一.函数的定义和调用

1.函数的定义

(1)函数代码块以 def 关键词开头,后接函数名称和小括号();

(2)小括号之间可以定义参数,任何传入的参数和变量必须放在小括号中间。

(3)函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

(4)函数内容以冒号起始,函数体代码块要进行缩进。

(5)return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

函数定义语法如下:

def 函数名():
    "函数文档字符串"
    代码块

函数定义后并不会直接执行,需要进行调用才会执行。

2.函数的调用

函数必须调用才会进行执行。调用方式如下:

函数名()

在Python中,函数需要先定义再调用。

def func1():
    pass

func1()    #如果写在函数定义之前,执行会报错

3.函数的参数

(1)位置参数

调用函数时,传递的参数个数和值的顺序必须与定义的形式参数的顺序对应。这称之为位置参数。调用时传入的参数个数不对会报错。

def func1(a, b):
    print(f'a:{a},b:{b}')

func1('A', 2)   #a:A,b:2
func1()     #TypeError: func1() missing 2 required positional arguments: 'a' and 'b' 调用时不传参或参数个数不对则会报错

(2)关键字参数

  • 关键字参数是一个在函数调用时的概念,而不是定义函数时的语法或概率。
  • 关键字参数是指使用 形参=实参 的方式来传入参数。
  • 关键字参数传递参数不需要与形参的位置完全一致,只要将参数名写正确即可。
def func1(name, age):
    print(f'姓名:{name},年龄:{age}')


func1(name='sam', age=20)   #姓名:sam,年龄:20
func1(age=20, name='sam')   #姓名:sam,年龄:20
func1('sam', 20)            #姓名:sam,年龄:20 
func1(20, 'sam')            #姓名:20,年龄:sam

(3)默认参数

 调用函数时,默认参数如果不传入实参,则使用默认值。默认参数如果传入实参,则使用传入的实参。

def func1(name, age=18):
    print(f'姓名:{name},年龄:{age}')

func1('sam')        #姓名:sam,年龄:18
func1('sam', 20)    #姓名:sam,年龄:20

(4)不定长参数

又叫可变长度参数、任意参数。如果事先不知道参数个数,就可以使用不定长参数。

不定长参数有2种:

一种是 *xx 的形式,函数定义时,在参数前加一个星号*,在传入参数时可以不用指定参数名,直接传入值即可,参数个数不固定,参数以元组的形式导入;

一种是 **xx 的形式,函数定义时,在参数前加两个星号**,在传入参数时以关键字参数的形式传入,参数个数不固定,参数以字典的形式导入。

def func1(*args):
    print(args)

func1(1, 'a', [1, 2])   #(1, 'a', [1, 2])
func1('abc')            #('abc',)
def func2(**kwargs):
    print(kwargs)

func2(name='sam', age=18, score=81)     #{'name': 'sam', 'age': 18, 'score': 81}
def func3(name, *args, **kwargs):
    print('name:', name)
    print('*args:', args)
    print('**kwargs', kwargs)

func3('sam', 18, 'aa', score=67, gender='')
# name: sam
# *args: (18, 'aa')
# **kwargs {'score': 67, 'gender': ''}

4.return语句和函数的返回值

return语句用于返回函数的处理结果或其他数据。当return被执行,函数调用也会结束(类似循环中的break)。

def num2en(num):
    if num in range(10):
        return ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'][num]
    else:
        print('仅支持数字0-9')

print(num2en(2))    # two
def func1():
    for i in range(10):
        return i    # 

print(func1())  # 0 return语句返回i并且会结束函数的调用,因此func1()的for循环只会执行1次,返回0,然后就结束了函数调用

5.变量的作用域

变量起作用或者说生效的范围称为变量的作用域。

变量分为:局部变量 、全局变量。

局部变量

局部变量是在函数中定义的变量,只在函数内部生效。函数形参就是局部变量。

def func1(name):
    age = 18                    # name和age都是局部变量,在函数内赋值时默认是为局部变量赋值,不会影响到函数外的变量
    print(f'{name}:{age}')

func1('sam')    # sam:18
print(name,age) # NameError: name 'name' is not defined

全局变量

全局变量是在函数内外都能生效的变量,是在函数外定义的。

name = 'sam'
def func1():
    print(name)

func1()             #sam

def func2():
    name = 'tom'    # 此时name在函数内部直接赋值,函数内的name是局部变量,是在函数内新声明了一个变量,与函数外的name无关
    print(name)     #

func2()             #tom
print(name)         #sam

要想在函数内对全局变量进行修改,需要使用 global 进行声明,表明是全局变量,示例如下:

name = 'sam'
print(name)         #sam
def func2():
    global name     # 声明name为全局变量
    name = 'tom'    # 此时对name进行赋值就是对全局变量name进行赋值
    print(name)     #

func2()             #tom
print(name)         #tom

 6.函数的嵌套

函数嵌套是指在函数内部又定义函数。

示例:

def func1():
    print('外层函数1')
    def func2():
        print('内层函数')
    print('外层函数2')
    func2()

func1()
# 外层函数1
# 外层函数2
# 内层函数

 

posted on 2023-04-03 19:09  木去  阅读(139)  评论(0)    收藏  举报