Python自学笔记_day04

本文详细介绍了Python中的函数基础知识,包括函数分类、参数类型、函数嵌套和全局、局部变量的使用。此外,还讲解了匿名函数(lambda)的语法特性和递归函数的概念及注意事项,强调了递归函数的结束条件和潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数基础

定义:一般是完成具体独立功能的代码块,为了最小化代码冗余,提高代码的复用率,问题局部化

1.1函数分类

def functionA():
    '''
    无参无返回值函数
    :return:无
    '''
    print('Hello,鹿鸣松')
functionA()

def functionB(name):
    '''
    带参无返回值函数
    :return:
    '''
    print('Hello,%s'%(name))
functionB('鹿鸣松')

def functionC():
    '''
    无参有返回值函数
    :return:
    '''
    a=1
    b=2
    return a+b
params=functionC()
print(params)

def functionD(a,b):
    '''
    带参有返回值函数
    :return:
    '''
    return a+b
params=functionD(1,2)
print(params)

1.2参数分类

定义:参数是为了实现某项特定的功能所需要的数据

分类:必选参数、默认(缺省)参数、可选参数、关键字参数

# 1.必选参数
def sum(a, b):  # 形参:只是意义上的一种参数,并没有开辟内存空间
    sum = a + b
    print(sum)
sum(1, 4) #实参:实际开辟了内存空间

#2.缺省参数
def sum1(a=1,b=2):
    '''
    如果不传参数值,则使用默认参数值;另外默认参数一定要放在最后面,放在形参前面会有报错
    :param a:
    :param b:
    :return:
    '''
    print(a+b)
sum1(5)#输出结果为7,因5给了a

#3.不定长参数,当参数的个数不确定时使用
def functionA(*args):
    '''
    是元组类型的数据
    :param args:
    :return:
    '''
    print(type(args))
    for item in args:
        print(item,end=' ')

functionA(1,2,3,4,5,6)
print()

#4.关键字参数,在函数体内,参数关键字是一个字典类型,key是一个字符串
def functionB(**kwargs):
    '''

    :return:
    '''
    print(kwargs)
dictA={'name':'鹿鸣松','age':24}
functionB(**dictA)
functionB(name='鹿鸣松',age=24)

#5.不定长和关键字混合使用
def complexFunc(*args,**kwargs):
    '''
    可选参数必须放到关键字参数之前,也就是括号中两个参数的顺序不能换
    可选参数接受的是元组类型
    关键字可选参数接受的是字典类型
    :param args:
    :param kwargs:
    :return:
    '''
    # print(type(args))
    # print(type(kwargs))
    print(args)
    print(kwargs)
complexFunc(1,2,3,4,name='鹿鸣松')#这边的字典类型参数能被正常识别
complexFunc(1,2,3,4,dictA)#这边的dictA被放入可选参数了

1.3函数嵌套调用

def functionA(a=10,b=30):
    return a+b

def functionB(a,b=96):
    result=functionA(a,b)
    return result

print(functionB(10))

二、全局变量和局部变量

定义:局部变量的作用域是在函数体内的,而全局变量作用域整个文件。局部变量优先于全局变量,也就是在函数内,如果出现和全局变量一样的参数,则优先使用函数体内的变量。

name='鹿鸣松'
def printName():
    name='鹿鸣雪'
    print(name)
printName()#输出结果为鹿鸣雪

修改全局变量的方法

name='鹿鸣松'
def modName():
    global name #得先声明
    name='鹿鸣雪'

modName()
print(name)

三、匿名函数

语法:lambda 参数1、参数2、参数3:表达式

特点:

  • 使用lambda关键字去创建函数
  • 没有名字的函数
  • 匿名函数冒号后面的表达式有且只有一个,注意:是表达式,而不是语句
  • 匿名函数自带return,而这个return的结果,就是表达式计算后的结果
#语法结构 lambda 参数1、参数2、参数3:表达式
#特点
add=lambda x,y:x+y
#通过变量去调用函数
print(add(22,18))

'''
这里a,b,c是参数,值在后面的括号里,冒号后面就是表达式,只能有一条表达式
表达式的意思是,如果a>b,就返回a,反之返回c
'''
result=(lambda a,b,c:a if a>b else c)(10,20,30)#替换单分支
print(result)

#把上面的式子拆分写一下,如下
#创建匿名函数
fun=lambda a,b,c:a if a>b else c
rs=fun(10,20,30)
print(rs)

四、递归函数

定义:在函数体内再调用自己

特点:

  • 必须有一个明确的结束条件
  • 逻辑简单、定义简单
  • 容易导致栈溢出、内存资源紧张,甚至内存泄漏
def jiecheng(n):
    '''
    n的阶乘函数,递归函数简洁,逻辑清晰
    :param n:
    :return:
    '''
    if n == 1:
        return 1
    else:
        return n * jiecheng(n - 1)


print(jiecheng(5))


# 模拟实现树形结构的遍历,找到文件夹下的文件
import os  # 引入文件操作模块


def findFile(file_path):
    listRs = os.listdir(file_path)
    for fileItem in listRs:
        full_path = os.path.join(file_path, fileItem)  # 获取完整的文件路径
        if os.path.isdir(full_path):  # 判断是否为文件夹
            findFile(full_path)  # 如果是一个文件夹,再次去递归
        else:
            print(fileItem)
    else:
        return


findFile('F:\\英雄时刻')

五、内置函数

 

内置函数
函数类型函数名作用举例
数学运算函数abs求绝对值abs(-10),结果为10
round取近似值round(2.6),结果为3
pow求次方pow(3,3),结果为27
divmod求商和余数divmod(7,3),结果为(2,1)是个元组类型
max求最大值max([1,3,5]),结果为5,参数是个序列,如列表、元组、字符串等
sum求和sum((1,2)),结果为3,参数是个序列,如列表、元组、字符串等
eval执行字符串表达式eval('x*y+z',{'x':10,'y':10,'z':1}),结果为101,参数1是表达式子,后面如果赋值,需要以字典格式来赋值
类型转换函数int转为整型int(2.6),结果为2
float转为浮点型float(2),结果为2.0
str转为字符串类型str(2),结果是个字符串类型的2
chr数字转字符chr(2)
ord给一个unicode的字符的字符串,返回一个整数,表示该字符的unicode代码点ord('a'),结果为97
bin十进制转换成2进制bin(2),结果为0b10
hex十进制转十六进制hex(16),结果为0x10
oct十进制转8进制oct(10),结果为0o12
list将元组转换为列表list((1,2,3)),结果为[1,2,3]
tuple将列表转元组tuple([1,2,3]),结果为(1,2,3)
bytes转字节bytes('鹿鸣松',encoding='utf-8'),结果为b'\xe9\xb9\xbf\xe9\xb8\xa3\xe6\x9d\xbe'
bool转布尔类型,有参为结果true,无参为falsebool(1),结果为True
序列操作函数all判断给定的可迭代参数中的所有元素是否都为True,如果是则返回True,否则返回False。元素除了是0、空、FALSE外都算Trueall((0,2,3)),结果为False
any判断给定的可迭代参数中的所有元素是否都为False,如果是则返回Flase,否则返回True。元素除了是0、空、FALSE外都算Trueany((0,False,'')),结果为False
sort在原来的基础上进行排序,并将值由原来的变量指向li=[2,1,0],li.sort(),结果为[0,1,2]
sorted排序后生成一个新的列表sorted(params,reverse=True/False)

sorted([1,2,0],reverse=True),结果为[2,1,0]

reverse反向列表中的元素li=[0,2,1],li.reverse()结果为[1,2,0]
range创建一个整数列表range(0,4,2),打印出来的结果就是0,2
zip将可迭代的对象作为参数,按序列对象中对应索引位置的元素打包成一个个元组,然后返回这些元组组成的列表。如果迭代器的元素个数不一致,则返回的列表长度与最短的对象相同list(zip([1,2,3],('name','age','kk'),[435,56,'asd'])),结果为[(1, 'name', 435), (2, 'age', 56), (3, 'kk', 'asd')]
enumerate将一个可遍历的对象组合为一个索引序列,同时列出数据和数据下标,一般用在for循环中。参数可以是列表、元组、字符串、字典enumerate(params,索引开始下标)
集合操作函数set不支持索引和切片,是一个无序的且不重复的容器,类似于字典,但没有value这个集合打印出来的结果,里面的元素排序可能每次都不一样
set.add往集合里添加元素 
set.clear清空集合 
set.difference两个集合的差集

set1.difference(set2)或者set1-set2结果是set1中在set2中没有的元素

set.intersection两个集合的交集set1.intersection(set2)和set1&set2这两个表达式都是取两个集合的交集
set.union两个集合的并集set1.union(set2)和set1 | set2 这两个表达式都是取两个集合的并集
set.pop从集合中随机拿数据并同时删除 
set.discard移除集合中的指定数据

set1.discard(1),再打印set1就没有1这个元素了

set.update在原集合的基础上更新集合,集合里的元素是唯一的,所以更换的时候会去重,数学知识set1.update(set2)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值