学习 Python 之 函数

Posted _DiMinisH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习 Python 之 函数相关的知识,希望对你有一定的参考价值。

学习 Python 之 函数

python函数

1. 函数的作用和特性

  1. 功能性
  2. 隐藏细节
  3. 避免编写重复代码
  4. 组织代码

2. 函数的定义

def function_name(parameter_list):
    pass

parameter_list是参数列表, 可有可无

例子: 定义一个add()函数实现两个数的相加, 返回相加后的结果

def add(x, y):
    return x + y

3. 函数的定义时声明变量类型

定义函数时, 不给函数的参数类型和返回值类型, 这让其他人调用时会很疑惑

类型解释
int整数-
float浮点数-
str字符串-
bool布尔-
bytes字节-
any任何数据类型-
...与之前类型相同-
List[]列表typing
Dict[]字典typing
Tuple[]元组typing
Set[]集合typing
def add(参数名: 类型, ...) -> 返回值类型:
    return ...

例: 加法函数

def add(a: int, b: int) -> int:
    return a + b

注意, 变量声明类型只是方便调用者或者读者

def add(a: int, b: int) -> int:
    return a + b

print(add("1", "2"))

结果:

12

4. 函数返回值

使用return关键字让函数有返回值, 如果函数没有返回值, 返回值为None

(1). 返回多个值

def fun(x, y):
    return x, y

当返回值大于一个时, 返回结果是一个元组

def fun(x, y):
    return x, y
    
print(fun(1, 2))

结果为:

(1, 2)

(2). 接收返回值

第一种接收方法和使用方法(不推荐)

def fun(x, y):
    return x, y
    
result = fun(1, 2)
print(result[0], result[1])

第二种接收方法和使用方法(推荐)

def fun(x, y):
    return x, y
    
a, b = fun(1, 2)
print(a, b)

这种方法也成为序列解包

(3). 序列解包

将一个序列的值逐一把赋给其他变量

序列: 字符串、列表、元组、字典、集合

a, b, c = [1, True, 'a']
print(a, b, c) 

1, True, ‘a’

当函数有多个返回值是, 将返回一个元组, 元组是序列, 所以可以使用序列解包

a, b, c = 'abc'
print(a, b, c)

a b c

快速赋值

a, b, c = 1, 2, None
print(a, b, c)

1, 2, None

快速复制的原理也是序列解包

a = 1, 2, None
print(type(a))

<class ‘tuple’>

5. 函数参数

参数类型例子
必须参数fun(1, 2)
关键字参数fun(y = 1, x = 2)
默认参数fun(1)
可变参数def fun(*parmeter):
关键字可变参数def fun(**parmeter):
(1). 必须参数

函数中规定了几个参数, 调用该函数时就必须传递几个参数

def fun(x, y):
    return x, y
    
a, b = fun(1, 2)
print(a, b)

fun函数规定了两个参数, 调用时必须传递两个参数

(2). 关键字参数

默认情况下, 传入的参数是从左向右依次赋值的

def fun(x, y):
    return x, y

对于fun函数, 调用时fun(1, 2), 则x=1, y=2

关键字参数用来指定参数的值

def fun(x, y):
    return x, y
    
a, b = fun(y = 1, x = 2)

此时, x的值被指定为2, y的值被指定为1

(3). 默认参数

函数参数不传时有一个默认值

def fun(x, y = 2):
    return x, y
    
a, b = fun(1)

上述例子, y的值没有传入, 就为默认值

默认参数必须在必须参数的左边

下面这个例子是错误的

def fun(x, y = 2, z):
    return x, y, z
    
fun(1, 3)

正确写法

def fun(x, y, z = 2):
    return x, y, z
    
fun(1, 3)
(4). 可变参数

参数前面使用*表示该参数是可变参数, 可变参数表示, 调用该函数时, 传入的参数可以是不确定个数的

定义一个可变参数函数

def fun(*parament):
    print(parament)

fun(1, 2, 3, 4)

输出

(1, 2, 3, 4)

参数列表会转换成元组

如果传入参数为元组, 结果就会变成元组的元组

fun((1, 2, 3, 4))

((1, 2, 3, 4), )

如果我想传入元组, 进入函数不让它变成元组的元组, 怎么办呢?

使用*

def fun(*parament):
    print(parament)

fun((1, 2, 3, 4))
fun(*(1, 2, 3, 4))

结果为, 使用*后, 参数没有被转换成元组的元组

((1, 2, 3, 4),)

(1, 2, 3, 4)

(5). 关键字可变参数

如果要指定参数的名字和值, 仅使用可变参数是不行的

def fun(*para):
    print(para)

fun(a = 1, b = 2)

这样会出现错误

Traceback (most recent call last):
  File "C:\\Users\\Administrator\\Desktop\\python\\demo.py", line 8, in <module>
    fun(a = 1, b = 2)
TypeError: fun() got an unexpected keyword argument 'a'

那么如何实现呢, 使用**

def fun(**para):
    print(para)

fun(a = 1, b = 2)

结果

‘a’: 1, ‘b’: 2

但是结果变成了字典, 所以可变关键字参数列表会被转换成字典

使用**

def fun(**para):
    for k, v in para.items():
        print(k, '-', v)

a = 
    '1': 'one',
    '2': 'two'


fun(**a)

1 - one

2 - two

6. 变量作用域

(1). 作用域

作用域类型说明
全局作用域在函数外部的作用域, 变量可以在整个应用程序中使用
函数作用域局部变量, 变量只能在函数内部使用

for循环外部可以引入for循环内部的变量, 因为python没有块级作用域

def funOne():
    c = 2
    print('one', id(c))
    def funTwo():
        c = 3
        print('two', id(c))
        print(c)
    funTwo()

funOne()

结果

one 2571382423824

two 2571382423856

3

(2). global关键字

用于将局部变量变成全局变量

def func():
    global c
    c = 2

func()
print(c)

2

以上是关于学习 Python 之 函数的主要内容,如果未能解决你的问题,请参考以下文章

2017寒假零基础学习Python系列之函数之 递归函数

Python之模块篇

Python新手学习基础之函数-可变参数**

Python学习—基础篇之常用模块

Python之常用模块学习

Python数据分析之numpy学习