Python基础知识(函数)

一、Python中函数的定义

  函数的定义:是指将一组可重复使用的、用来实现某一关联功能的语句(代码段)通过一个名字(函数名)封装起来,在想要执行这个函数时,只需要通过“函数名”直接调用即可。函数的特点:功能强大、调用方便及灵活高效。

二、Python中函数的语法

  1.关键字:“ def ” 是关键字。是用来识别是否为一个函数,不可缺少。

  2.函数名:“square” 是函数名。可自定义,不要使用“关键字”或“内建函数”同名。

  3.参数:“x,y” 是参数(形参),“12,20”是参数(实参)。形参不是必须的,可以不填,但是()不能省略。

  4.方法:“s = x*y” 是函数方法。组织好的函数语句,默认缩进1个tab键(等同4个空格)。

  5.返回值:“return” 是返回值。return后面可以没有返回值,甚至return语句也可省略,默认返回值为None。

# 1)函数的语法:
def square(x,y):      # 声明一个函数(方法)

    s = x * y         # 函数语句(方法)
    print(s)                                     # 注意:输出语句放在函数里面!
# 没有return square(12,20) # 调用函数(方法) >>240
# 2)函数的语法:
def square(x,y): # 声明一个函数(方法) s = x * y # 函数语句(方法) # 函数内部无输出语句。 return s # 返回变量 b = square(12,20) # 调用函数(方法),并通过变量 "b" 去接收返回值 "s" print(b) # 输出语句放在外面,打印的值是接收变量的值。 >>240 

三、参数类型解析

  Python函数中的参数:实参(1种)【关键字参数】+形参(4种)【必须参数;可变参数;默认值参数;可变关键字参数】。

  1.关键字参数:"param1" ,在实参中定义。将实参的赋值指定给予某形参,可以不用记住传参的顺序。

  2.必须参数:"param2" ,在形参中定义。对应于形参,有多少个形参就给出多少实参。在实参中传"param1",函数在调用时,可将它用于函数方法的运算。

  3.可变参数:"*args" ,在形参中定义。形参中直接传"*args",函数在调用时,实参可以传递任意个参数。

  4.默认值参数:"param3" , 在形参中定义。给函数的形参赋予默认值。

  5.可变关键字参数:"**kwargs" ,在形参中定义。形参中传"**kwargs",函数在调用时,实参可以传递任意个关键字参数。

# 示例语法展示:
def square(param2,*args,param3=0,**kwargs): pass return # square(param2,param1=8)
# 1)关键字函数(在实参中定义)
def fruit(apple,lemon):
    print("苹果的数量为:"+ str(apple))
    print("柠檬的数量为:" + str(lemon))
fruit(2,lemon=12)   #lemon=12“关键字参数”可以不用记住参数的顺序


>>苹果的数量为:2
>>柠檬的数量为:12
# 2)必须参数:
# 不建议定义过多必须函数;如需要,可将多个必须参数封装成一个对象,把对象传入到函数中。
# 需求:创建一个函数,录入苹果、柠檬两种水果数量,并打印详情

def detail(apple, lemon):
    print("苹果的数量为:" + str(apple))
    print("柠檬的数量为:" + str(lemon))

detail(4, 5)


# >>苹果的数量为:4
# >>柠檬的数量为:5
# 3)可变参数:
# 需求:创建一个函数,用户可传入任意值,并返回任意值相加后的值
def add_all(*args):
    summ = 0
    for i in args:
        summ = summ + i
        print(summ)
    return summ


# add_all(1, 2, 3, 4)        # 可传入任意个参数

a = (1, 2, 3, 4)             # 如果传入的是一个序列,可使用*将每个元素平埔出来,传递到可变参数的函数里面。
add_all(*a)


>>1
>>3
>>6
>>10
# 4)默认值参数:
def fruit(apple=1, lemon=2):  # 在形参中定义,设置默认值。
    print("苹果的数量为:" + str(apple))
    print("柠檬的数量为:" + str(lemon))

fruit()
# fruit(lemon=5)  # 可使用关键字参数对默认值参数赋值,改变默认值参数的定义


>>苹果的数量为:1
>>柠檬的数量为:2
# 5)可变关键字参数 :
def fruit(**kwargs):
    print("水果的数量为:" + str(kwargs))
    # print(type(kwargs))         # kwargs的类型为字典


# fruit(lemon=5, apple=10)         # 可传递任意个关键字参数,这些关键字参数在函数调用的时候会自动组装成一个dict。

fruits = {"lemon": 5, "apple": 10}
fruit(**fruits)                        # 如果传的是一个字典,用 "**" 将字典中的键值对平铺出来。


>>水果的数量为:{'lemon': 5, 'apple': 10}
# 补充内容:函数中形参的传参顺序【1.必须参数-2.可变参数-3.默认值参数-4.可变关键字参数】
def fruit(apple_num,*args,banana_num=5,lemon_num=4,**kwargs):
    print("苹果的数量为:"+ str(apple_num))
    print("柠檬的数量为:" + str(lemon_num))
    print("香蕉的数量为:" + str(banana_num))
    print("数量为:" + str(args))
    print("水果的数量为:" + str(kwargs))
numm=(3,5,4)
fruits={"苹果":3,"柠檬":4,"香蕉":5}      
fruit(10,*numm,**fruits)


>>苹果的数量为:10
>>柠檬的数量为:4
>>香蕉的数量为:5
>>数量为:(3, 5, 4)
>>水果的数量为:{'苹果': 3, '柠檬': 4, '香蕉': 5}

四、内建函数

  Python自带的函数【print()、len()、help()等】,也就是说这是python的类库帮我们已经写好的函数,只需要我们直接使用就可以了。

# 内建函数-del 的用法:
a = [1, 2, 3]    # 对象[1, 2, 3]被 a 引用
b = a            # 对象 a 被 b 引用
c = b            # 对象 b 被 c 引用

print(a)

del a  # 删除变量a,解除a对[1, 2, 3]的引用
del b  # 删除变量b,解除b对[1, 2, 3]的引用

# print(a)
# print(b)         # 会报错,NameError: name 'b' is not defined
print(c)          # 最终变量c仍然引用1


>>[1, 2, 3]
>>[1, 2, 3]
# 内建函数-3个常见输出函数【print()、eval()、input()】

print("你是谁!")

a = eval("20+20")   # eval()函数去掉字符串最外侧的引号,并按照python语句方式执行去掉引号后的字符串内容。
print(a)

input("我在哪?")  # 阻塞式输出。


>>你是谁!
>>40
>>我在哪?_

五、匿名函数

  匿名函数:就是没有名字的函数。Python中使用 lambda 来创建匿名函数。lambda 函数的语法只包含一个语句【 lambda [arg1 [,arg2,...argn]] : expression 】。

sum = lambda arg1, arg2: arg1 + arg2

demo = sum(20, 40)

# print("相加后的值是:", sum(10, 20))
print("相加后的值是:", demo)


>>相加后的值是: 30
>>相加后的值是: 60

六、自定义函数

  用户自己创建的函数被叫做自定义函数。

def summ(x, y, z):
    s = x + y + z
    print(s)
    return s

summ(3, 4, 5)


>>12

七、递归函数

# 定义:在函数内部可以调用其他函数,如果调用的是本身,这个函数就是递归函数
# 特性:
# 1、必须要有明确的结束条件
# 2、每次更深一层递归时,问题模块相比上一次递归减少
# 3、递归效率不高,递归层次过多会导致栈溢出

def calc(n):
    print(n)
    if int(n/2) >0:
        return calc(int(n/2))
    print('...',n)
calc(10)


>>10
>>5
>>2
>>1
>>... 1

 八、函数的过滤、映射与聚合

#函数的数据处理:过滤、映射与聚合
#三个基础函数:filter()、map()和reduce()
# 语法:filter(function,iterable) function是一个函数,参数iterable是可迭代对象;
#filter()函数调用时iterable会被遍历,它的元素被逐一传入function函数,function函数返回布尔值。
#在function函数中编写过滤条件,如果为True的元素被保留,如果为False的元素被过滤掉。
# 示例1:
# users=["Tony","Tom","Ben","Alex"]
# users_filter=filter(lambda u:u.startswith("T"),users)   #如果字符串以指定的值开头,则 startswith() 方法返回 True,否则返回 False。
# print(users_filter)
# print(list(users_filter))

# 语法:map(function,iterable) function是一个函数,参数iterable是可迭代对象;
#示例2:
# users=["Tony","Tom","Ben","Alex"]
# users_map=map(lambda u:u.lower(),users)
# print(list(users_map))

#聚合操作会将多个数据聚合起来输出单个数据,聚合操作中最基础的是归纳函数reduce(),
#reduce()函数会将多个数据按照指定的算法积累叠加起来,最后输出一个数据。
# 语法:reduce(function,iterable[,initializer]) function是一个函数,参数iterable是可迭代对象,参数initializer是初始值;
#示例2:(实现对一个数列的求和运算)
from functools import reduce
a=(1,2,3,4)
a_reduce=reduce(lambda  acc,i:acc+i,a)
print(a_reduce)
上一篇:Vue技术栈开发学习之状态管理bus的使用


下一篇:内核对设备树的处理