Python函数 -*- Python基础知识08 -*-

函数简介

用来保存一些可执行代码,并在需要可以对代码进行多次调用。
函数是一个对象,对象就是我们在计算机中开拓的区域。

函数的创建于使用

函数语法

# 创建函数
def 函数名(形参1,形参2,形参……)
	代码块

函数中保存的代码块不会立即执行
需要调用后才会执行
调用方法:函数名(实参1,实参2,实参3……)

参数

形参和实参

形参:形式上的参数,定义形参就相当于在函数内部已经声明了变量,但此处的变量并没有赋值
实参:真实的参数,如果在函数中定义了形参,那在调用的时候必须传递实参,实参将会赋值给形参,且实参和形参数量需一致有几个形参就必须要穿几个实参。

默认值:定义参数的时候可以给形参一个默认值,指定默认值后,如果用户传递了参数,则默认值不会生效,如果用户没有传递参数,则会使用默认值。

def fn(a,b,c = 1)

参数的传递方式

  1. 位置参数传递
    将对应位置的实参传递给对应位置的形参。
  2. 关键字参数传递
    根据参数的名称去传递,可以不按照参数定义的位置传递。

位置参数和关键词参数可以混合使用,但是位置参数必须放在关键字参数之前

实参可以传递任意类型的参数。(包括函数)

def fn(a, b, c):
    print(a, type(a))
    print(b, type(b))
    print(c, type(c))
fn(1,2, c = '我是c')

不定长参数

不定长参数可以让一个形参接收所有的实参,或者让一个实参打包发送所有的形参。

  1. 形参前加*可让形参将接受到的变量转变成元祖,*不定长参数可以和其他参数配合使用,*不定长参数不必写在最后但是不定长参数后面必须为关键词参数。*处理的是位置参数
  2. 形参前加**可以让一个形参接受多个关键词参数,有了**参数后实参传递的未知关键字参数都会已字典的形式保存其中。且**形参只能有一个,且只能放置在所有参数的最后。**处理的是关键字参数。

*和**两种不定长参数可以一起使用

def fn(i, *j, **a):
    print(i, type(i)) # 1 <class 'int'>
    print(j, type(j)) # (2, 3, 4, 5, 6, 7, 8) <class 'tuple'>
    print(a, type(a)) # {'a': '我是a', 'b': '我是ac之间的家伙', 'c': '那我就是c咯'} <class 'dict'>
fn(1, 2, 3, 4, 5, 6, 7, 8, a = '我是a' , b = '我是ac之间的家伙', c = '那我就是c咯')

参数的解包

在实参中使用*即可解包,传递实参可以在可迭代的实参前加*,加*后会自动将可迭代对象中的元素依次作为参数传递。字典只传输key。不过形参的数量要与可迭代对象的元素数量一致。

a = [0,1,2]

def fn(a, b, c):
    print(a, b, c) # 0 1 2
fn(*a)

函数的返回值

return 用来指定返回值,返回值可以直接使用,也可以赋值给一个变量,return后可以跟任意的对象,甚至是一个函数
如果函数中写的return后没有返回值,或没写ruturn,函数的返回值会是None

在return之后的代码都不会执行,return一旦执行,函数自动结束

调用函数时带(括号)和不带(括号)的区别

当不加()时,调用的是函数对象,直接打印不带括号的函数,会输出一个地址。
当加(),则是调用函数,打印时会输出函数的返回值。

a = fn
b = fn()
print(f'我是没有带括号的函数:{a}。我是带了括号的函数:{b}') # 我是没有带括号的函数:<function fn at 0x0000020E66684048>。我是带了括号的函数:1

帮助文档

help()可以查询Python函数中的用法

语法:help(函数对象)

help(print) # 输出的东西有点多,可以自己试试

建立帮助文档

在函数中用三对双引号建立(可以用单引号,但根据PEP8规则不建议使用单引号。)
形参后可以参数指定类型,或者在定义的函数后根->来指定参数类型(此方法较为少用)

def fn(a:int,b:str,c:bool)->int:
    """
    函数的参数
    :parama:这是一个字母a,并没有什么卵用
    :paramb:这是一个并没有什么卵用的字母b
    :paramc:我是一个莫得感情的字母c
    :return:我就不告诉你我要返回啥,皮一下就是很开心
    """
    return 10
help(fn)

此处的help输出是:

Help on function fn in module main:

fn(a: int, b: str, c: bool) -> int
函数的参数
:parama:这是一个字母a,并没有什么卵用
:paramb:这是一个并没有什么卵用的字母b
:paramc:我是一个莫得感情的字母c
:return:我就不告诉你我要返回啥,皮一下就是很开心

函数的作用域

在Python中有两种作用域:

  1. 全局作用域
    全局作用域在程序执行时创建,在程序结束时销毁,所有函数以外的区域都是全局作用域。
    全局作用域中定义的变量属于全局变量,全局变量可以在任意位置访问。
  2. 函数作用域
    函数作用域在函数创建时创建,在函数结束时销毁,函数每次调用一次就会产生一个新的函数的作用域。
    在函数作用域中定义的变量是局部变量,局部变量的作用域只有函数内部,函数外部无法访问。

在函数内部想要修改全局变量,可以使用关键字global来实现,切必须先声明在修改。

data = '原始数据'


def fn():
    global data
    data = 'fn中第一次赋值'
    def fn1():
        data = '我又被赋值了'
        print(data)
    fn1()
    print(data)
    
    
fn() # 我又被赋值了 fn中第一次赋值
print(data) # fn中第一次赋值

从上面我们可以看出在fn1中我们给dara赋值的时候没用用global,所以在fn1中赋的值只会影响fn1函数,在全局中不受影响,但是在fn函数中,我用了global声明data,之后在给data赋值,赋的值影响到了全局变量中的data

发布了47 篇原创文章 · 获赞 23 · 访问量 3436

猜你喜欢

转载自blog.csdn.net/qq_39611230/article/details/102578779