python函数

一. 函数的定义

def 函数名(参数):
    """ 说明文档的位置 """
    代码1
    代码2
    return 返回值

说明:

  1.参数可有可无,根据需要而定

  2. return语句可有可无,根据是否有返回值而定

二. 函数的调用

函数名(参数)

 三. 函数返回值

1. 一个返回值

def return_num():
    return 1

result = return_num()
print(result)  # 1

2. 多个返回值

def return_num():
    return 1, 2

result = return_num()
print(result)  # (1, 2)

说明:返回多个返回值时,实际上返回的是一个tuple

四. 函数的参数

1. 参数的类型

1.1 普通参数

def fun1(a):
    print(a)

fun1("hello")  # hello
fun1()  # TypeError: fun1() missing 1 required positional argument: 'a'

说明:调用函数时,普通参数必须传,否则会报错

1.2 带默认值的参数(缺省参数)

def fun1(a, b="world"):
    print(a, b)


fun1("hello", "China")  # hello China
fun1("hello")  # hello world
def fun1(b="world", a):     # 普通参数在默认参数之后,报错SyntaxError: non-default argument follows default argument
    print(a, b)

说明:

1. 缺省参数可传可不传,不传则使用默认值

2. 所有普通参数必须出现在默认参数前

1.3 可变参数(不定长参数) 

不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递

1.3.1 可变位置参数
def fun1(*args):
    print(args)


fun1("hello", "China")  # ('hello', 'China')
fun1("hello")  # ('hello',)
fun1()      # ()

说明:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。

1.3.2 可变关键字参数:
def fun1(**args):
    print(args)


fun1(name="abc", age= 18)  # {'name': 'abc', 'age': 18}
fun1(name="abc")    # {'name': 'abc'}
fun1()  # {}

说明:多个关键字参数被封装为一个字典

2. 传参的方式

2.1 位置参数

位置参数:调用函数时根据函数定义的参数位置来传递参数。

def user_info(name, age, gender):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('TOM', 20, '')  # 您的名字是TOM, 年龄是20, 性别是男

说明:

1. 按照参数的顺序依次传参,不指定参数名

2. 传递和定义参数的顺序及个数必须一致。

2.2 关键字参数

函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

def user_info(name, age, gender):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('Rose', age=20, gender='')
user_info(gender='', '小明', age=16)     # 报错:SyntaxError: positional argument follows keyword argument

说明:

1. 位置参数必须在关键字参数之前

2. 关键字参数间没有先后顺序

3. 关键字参数传递时,关键字直接写即可,不需要加引号

 五. 高阶函数

1. 基本使用

把函数作为参数传入,这样的函数称为高阶函数

def fn1():
    print("fn1执行了")

def fn2(func, c, d):
    func()
    print(c, d)

fn2(fn1, 1, 2) 
# fn1执行了 
# 1 2

说明:

1. 函数变量可以作为参数直接传递

2. 函数变量后跟()可直接调用这个函数

2. 内置高阶函数

2.1 map()

map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。

list1 = [1, 2, 3, 4, 5]

def func(x):
    return x ** 2

result = map(func, list1)
print(result)  # <map object at 0x0000013769653198>
for i in result:
    print(i)    # 依次打印每一个值

print(list(result))  # [1, 4, 9, 16, 25]

说明:

1. 返回的是一个迭代器对象(可直接for遍历或转换为列表)

2.2 reduce()

reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。

# 计算`list1`序列中各个数字的累加和。
import functools

list1 = [1, 2, 3, 4, 5]


def func(a, b):
    return a + b


result = functools.reduce(func, list1)

print(result)  # 15

说明:

1.必须引入functools模块

2.3 filter()

filter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表, 可以使用 list() 来转换。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


def func(x):
    return x % 2 == 0


result = filter(func, list1)

print(result)  # <filter object at 0x0000017AF9DC3198>
for i in result:
    print(i)    #打印每一个值

print(list(result))  # [2, 4, 6, 8, 10]

说明:

1.和map方法类似,返回一个可迭代对象

posted @ 2020-12-23 21:59  foreast  阅读(87)  评论(0编辑  收藏  举报