python入门基础知识六(函数)

函数要先定义,再调用!

一、函数参数的类型:

1. 形式参数和实际参数:

def funct_name(arguments):

  codes...

  codes...

 

funct_name(real arguments)

 

def funct_name(a,b):    # 定义函数,设置两个参数a、b,用来接收数据
  """This function calculates a+b. 两数求和函数"""  # 函数说明文档位置
result = a + b print(result) funct_name(520,1314) # 对a、b分别赋值520,1314,并调用函数

help(funct_name)  # 显示函数说明文档

-------------------------------------------------

 

1834
Help on function funct_name in module __main__:


funct_name(a, b)
This function calculates a+b. 两数求和函数

2. 位置参数

定义函数时,参数的名称和位置已经确定

def funct_name(argument1,argument2,argument3...):

def funct_name(number,name,age):
    print(f'No.{number},name:{name},age:{age}.')

funct_name('001','Zhangsan',28)  # 参数的实际值要按函数形参的顺序给定

----------------------------------------
No.
001,name:Zhangsan,age:28. Process finished with exit code 0

3. 关键字参数

以键-值的方式传入实际参数值,无关乎先后顺序

def funct_name(number,name,age):
    print(f'No.{number},name:{name},age:{age}.')
    
funct_name(age=28,number='001',name='Zhangsan')

No.001,name:Zhangsan,age:28.
Process finished with exit code 0

4. 缺省参数

指定参数的默认值,作为实际参数传入函数。若有位置参数,其必须在默认参数的前面,否则报错。

 def funct_name(name,age,gender='Male'):

  codes...

funct_name('Zhangsan',28)

funct_name('Lily',20,gender='Female')

5. 收集参数

def funct_name(*args):    # 接收任意数量参数,返回一个元组
    print(args)

funct_name('WTF',9527)

('WTF', 9527)    # 返回的结果是元组


def funct_name(**kwargs):   # 接收键值对,返回一个字典
    print(kwargs)

funct_name(地点='WW',人物='老妖婆',事件='流窜')

{'地点': 'WW', '人物': '老妖婆', '事件': '流窜'}

 

二、函数返回值:return

def funct_name(a,b):

  return a+b

遇到return,程序就会返回return后面的值或表达式,然后退出函数

 

三、函数递归

就是函数自己调用自己,但必须要有出口,否则成了无限循环。

"""计算1-100的累加结果"""
def funct_name(a):
    if a == 100:
        return 100    # 设置退出的出口
    outcome = a + funct_name(a+1)
    return outcome
result = funct_name(1)
print(result)

 

四、lambda表达式

函数只有一个返回值,且只有一句代码,就可以用lambda表达式简写。

1. lambda语法

lambda 形参: 表达式  # 形参可以省略,可以接收多个实参,但返回的只有一个表达式的值

 

 2. 带条件语句的lambda表达式

def funct_name(a,b):

  return a if a > b else b

print(funct_name(1,2))

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
print((lambda a,b:a if a > b else b)(1,2))

 3. 列表中字典数据的排序

list_name1 =[ {'name':'Zulu','age':47},{'name':'Alpha','age':38},{'name':'Dracula','age':400} ]
list_name1.sort(key=lambda x:x['name'], reverse=False)
print(list_name1)

list_name2 = [ { 'name':'孙兴华','age':20 } , {'name':'赵丽颖','age':33 } , {'name':'李小龙','age':80 } ]
list_name2.sort(key=lambda x:x['name'], reverse=False)
print(list_name2)

--------------------------

[{'name': 'Alpha', 'age': 38}, {'name': 'Dracula', 'age': 400}, {'name': 'Zulu', 'age': 47}]
[{'name': '孙兴华', 'age': 20}, {'name': '李小龙', 'age': 80}, {'name': '赵丽颖', 'age': 33}]

注意中文的排序和英文的排序逻辑不同,个人猜想造成这个现象的原因是语系问题。

 

五、高阶函数

基于已有的函数定义新函数,以函数作为参数,返回给函数

def func_name1(a,b):
    return abs(a)+abs(b)
result = func_name1(-5,3)
print(result)

def func_name2(a,b,c):
    return c(a) + c(b)
outcome = func_name2(-5,3,abs)
print(outcome)

---------------------------------

8
8

第二个函数设置了三个参数,然后将a,b作为c的参数,最后在给出实际参数时,将c的值赋为绝对值函数abs。

1. filter(函数名,迭代对象)

 筛选序列中符合条件的元素

a =  list(range(1,11))

def funct_name1(x):
    return x%2 == 0  # 将除2余数为零的数返回出来

outcome = filter(funct_name1,a)
print(outcome)    # 打印的是对象的内存地址
print(list(outcome))

-------------------------------

<filter object at 0x000001AC3A7F6970>
[2, 4, 6, 8, 10]

print(list(filter((lambda x:x%2 == 0),(range(1,11)))))  # 简略写法

2. map(函数名,迭代对象)

将序列中每个元素作为函数的参数进行运算

a =  list(range(1,5))

def funct_name(x):
    return x ** 2    # 计算该数的二次方

outcome = map(funct_name,a)
print(list(outcome))


print(list(map((lambda x:x ** 2),(range(1,5)))))    # 简略写法

-----------------------------

[1, 4, 9, 16]
[1, 4, 9, 16]

3. reduce(函数名(x,y),迭代对象)

函数中必须有2个参数,每次的计算结果继续和序列的下一个元素做累加计算

import functools    # 导入模块
a = list(range(1,101))
def funct_name(a,b):
    return a + b    # 计算加和
outcome =  functools.reduce(funct_name,a)    # 引入reduce函数后,将函数的每次计算结果和序列的下一元素做累加
print(outcome)


print(functools.reduce((lambda x,y : x + y),(range(1,101))))    # 简略写法

---------------------------------------

5050
5050

和前面两例相比,为什么这次不用list()转类型了?因为最终的加和结果是一个值,而不是列表,所以不需要用list转类型。

posted @ 2022-08-09 10:35  randy198  阅读(90)  评论(0)    收藏  举报