【Python基础】函数及常用的内置函数

本章目标

  • 掌握函数的定义及调用
  • 掌握函数的参数传递
  • 掌握函数的返回值
  • 掌握变量的作用域
  • 熟悉匿名函数lambda的使用
  • 熟悉常用的内置函数

一、函数的定义及调用

函数定义:
函数是将一段实现功能的完整代码,使用函数名进行封装,通过函数名称进行调用,以此达到一次编写,多次调用的目的。

内置函数:

  • 输出函数print()
  • 输入函数input()
  • 列表定义函数list()

自定义函数:

def 函数名称(参数列表):
	函数体
	[return返回值列表]

函数调用:
函数名(参数列表)

实例代码:

def get_sum(num):
    s=0
    for i in range(1,num+1):
        s+=i
    print(f'1到{num}之间的累加和为:{s}')
#函数的调用
get_sum(10) #1-10之间的累加和
get_sum(100) #1-100之间的累加和
get_sum(1000) get_sum(100) #1-1000之间的累加和

函数的使用总结:

函数定义:

  • 使用关键字def
  • 确定函数名称、参数名称、参数个数、编写函数体(用于实现函数功能的代码)

函数调用:

  • 通过函数名称进行调用函数
  • 对函数的参数进行实际的赋值

函数执行:

  • 使用实际函数参与函数功能的实现

函数返回结果:

  • 函数执行结束后,如果使用 return 进行返回结果,则结果被返回到函数的调用处

二、函数的参数传递

位置参数:

  • 是指调用时的参数个数和顺序必须与定义的参数个数和顺序相同
def happy_birthday(name,age):
    print('祝'+name+'生日快乐')
    print(str(age)+'生日快乐')
#调用函数
happy_birthday('cmm',20)

关键字参数:

  • 是在调用时,使用 “形参名称=值” 的方式进行传参,传递参数顺序可以与定义时参数顺序不同
  • 既有位置参数又有关键字参数传参,就要遵循 位置传参在前,关键字传参在后
def happy_birthday(name,age):
    print('祝'+name+'生日快乐')
    print(str(age)+'生日快乐')
#关键字传参
happy_birthday(age=18,name='cmm')
#happy_birthday(age=18,name1='cmm') #定义的形参为name TypeError: happy_birthday() got an unexpected keyword argument 'name1'

happy_birthday('cmm',age=18) #正常执行,位置传参,也可以使用关键字传参

#语法错误,违反了一个位置参数在前,关键字参数在后的一个规则
happy_birthday(name='cmm',18) SyntaxError: positional argument follows keyword argument

默认值参数:

  • 是在函数定义时,直接对形式参数进行赋值,在调用时如果该参数不传值,将使用默认值,如果该参数传值,则使用传递的值
  • 当位置参数和关键字值参数同时存在的时候,应该遵循 位置参数在前,默认值参数在后
def happy_birthday(name='cmm',age=18):
    print('祝'+name+'生日快乐')
    print(str(age)+'生日快乐')

#调用函数
happy_birthday() #不用传参,使用默认值参数
happy_birthday('章邯') #位置传参
happy_birthday(age=19) #关键字传参,name采用默认值

#当位置参数和关键字值参数同时存在的时候,应该遵循 位置参数在前,默认值参数在后
def fun(a,b=20): #a作为位置参数,b默认参数
    pass
#当位置参数和默认值参数同时存在的时候,位置参数在后会被报错
def fun2(a=20,b): #语法错误  SyntaxError: non-default argument follows default argument
    pass

可变参数:
可变参数又分为个数可变的位置参数和个数可变的关键字参数两种。

个数可变的位置参数:

  • 个数可变的位置参数是在参数前加一颗星(*para),para形式参数的名称,函数调用时可接受任意个数的实际参数,并放到一个元组中。
#个数可变的位置参数
def fun(*para):
    print(type(para))
    for item in para:
        print(item)

#调用
fun(10,20,30,40)
fun(10)
fun(20,30)
fun([11,22,33,44])  #实际上传递的是一个参数。
#在调用时,参数前面加一颗星,会将列表进行解包
fun(*[11,22,33,44])

个数可变的关键字参数:

  • 个数可变的关键字参数是在参数前加两颗星(**para),在函数调用时可接收任意多个 “参数=值” 形式的参数,并放到一个字典中。
#个数可变的关键字参数
def fun2(**kwpara):
    print(type(kwpara))
    for key,value in kwpara.items():
        print(key,'-------',value)

#调用
fun2(name='cmm',age=18,height=170)  #关键字参数
d={'name':'cmm','age':18,'height':170}
#fun2(d)   #TypeError: fun2() takes 0 positional arguments but 1 was given
fun2(**d)  #在调用时,参数前面加一颗星,会将列表进行解包

三、函数的反回值

返回值return:

  • 如果函数的运行结果需要在其他函数中使用,那么这个函数就应该被定义为带返回值的函数。
  • 函数的运行结果使用return关键字进行返回
  • return可以出现在函数中的任意一个位置,用于结束函数。
  • 返回值可以是一个值,或多个值,如果返回的值是多个,结果是一个元组类型。
def calc(a,b):
    print(a+b)
calc(10,20)
print(calc(1,2)) #没有定义返回值,则输出结果就是None

def calc2(a,b):
    s=a+b
    return s #将s返回给函数的调用去处理

print('-'*10)
get_s=calc2(1,2)
print(get_s)

#返回值可以是多个
def get_sum(num):
    s=0 #累加和
    odd_sum=0 #奇数和
    ever_sum=0 #偶数和
    for i in range(1,num+1):
        if i%2!=0: #说明是奇数
            odd_sum+=i
        else:
            ever_sum+=i
        s+=i
    return odd_sum,ever_sum,s  #返回三个值,返回值是一个元组
result=get_sum(10)
print(type(result))
print(result)

#解包赋值
a,b,c=get_sum(10)  #返回3个值,元组类型
print(a)
print(b)
print(c)

四、变量的作用域

变量的作用域是指变量起作用的范围,根据范围作用的大小可分为局部变量和全局变量

局部变量:

  • 定义:在函数定义处的参数和函数内部定义的变量
  • 作用范围:仅在函数内部,函数执行结束,局部变量的生命周期也结束

全局变量:

  • 定义:在函数外定义的变量或函数内部使用global关键字修饰的变量
  • 作用范围:整个程序,程序运行结束,全局变量的生命周期才结束
a=100 #全局变量
def calc(x,y):
    return a+x+y
print(a)
print(calc(10,20))
print('-'*40)

def calc2(x,y):
    a=200  #局部变量,局部变量的名称和全局变量的名称相同
    return a+x+y  #a是局部变量还是全局变量呢? 当全局变量和局部变量的名称相同时,局部变量的优先级高。
print(calc2(10,20))

def calc3(x,y):
    global s #s是在函数中定义的变量,但是使用了global关键字声明,这个变量s变成了全局变量
    s=300 #声明和赋值,必须是分开执行
    return a+x+y
print(calc3(20,30))
print(s)  #全局变量

五、匿名函数lambda

  • lambda: 是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化
  • 语法结构:result = lambda 参数列表:表达式
def calc(a,b):
    return a+b
print(calc(10,20))

#匿名函数
s=lambda a,b:a+b #表示就是一个匿名函数
print(type(s))  #<class 'function'>
#调用匿名函数
print(s(10,20))
print('-'*40)

#列表的正常取值操作
lst=[10,20,30,40,50]
for i in range(len(lst)):
    print(lst[i])
print()
#匿名函数的列表取值
for i in range(len(lst)):
    result=lambda x:x[i]  #根据索引取值,result的类型是function, x是形式参数
    print(result(lst)) #lst是实际参数

student_scores=[
    {'name':'cmm','score':98},
    {'name':'wyy','score':95},
    {'name':'ztl','score':100},
    {'name':'bxr','score':60}
]
#对列表进行排序,排序的规则是字典中的成绩
student_scores.sort(key=lambda x:x.get('score'),reverse=True) #降序
print(student_scores)

递归函数:

递归:

  • 在一个函数的函数体内调用该函数本身,该函数就是递归函数
  • 一个完整的递归操作由两部分组成,一部分是递归调用,一部分是递归终止条件,一般可使用 if-else 结构来判断递归的调用和递归的终止。

使用递归计算N的阶乘:

def fac(n): #n的阶乘,N!=N*(n-1)!....1!=1
    if n==1:
        return 1
    else:
        return n*fac(n-1)  #自己调用自己
print(fac(5))  #5!=5*4*3*2*1=120

六、常用的内置函数

数据类型转换函数:

函数名称描述说明
bool(obj)获取指定对象obj的布尔值
str(obj)将指定对象obj转换成字符串类型
int(x)将x转成int类型
float(x)将x转成float类型
list(sequence)将序列转成列表类型
tuple(sequence)将序列转成元组类型
set(sequence)将序列转成集合类型
print('非空字符串的布尔值:',bool('hello'))
print('空字符串的布尔值:','') #空字符串不是空格字符串
print('空列表的布尔值:',bool([]))
print('空列表的布尔值:',bool())
print('空元组的布尔值:',bool(tuple()))
print('空集合的布尔值:',bool(set()))
print('空字典的布尔值:',bool({}))
print('空字典的布尔值:',bool(dict()))
print('-'*30)
print('非0整数型的布尔值:',bool(123))
print('整数0的布尔值:',bool(0))
print('浮点数0.0的布尔值:',bool(0.0))

#将其他类型转成字符串类型
lst=[10,20,30]
print(type(lst),lst)

s=str(lst)
print(type(s),s)

print('-'*20,'float类型和str类型转换成int类型','-'*20)
print(int(98.7)+int('90'))
#注意事项:
#print(int('98.7'))  #ValueError: invalid literal for int() with base 10: '98.7'

print('-'*20,'int,str类型转换成float类型','-'*20)
print(float(90)+float('3.14'))

s='hello'
print(list(s))

seq=range(1,10)
print(tuple(seq))
print(set(seq))
print(list(seq))

常用的数学函数:

函数名称描述说明
abs(x)获取x的绝对值
divmod(x,y)获取x与y的商和余数
max(sequence)获取sequence的最大值
min(sequence)获取sequence的最小值
sum(iter)对可迭代对象进行求和运算
pow(x,y)获取x的y次幂
round(x,d)对x进行保留d位小数,结果四舍五入

常用的迭代器操作函数:

函数名称描述说明
sorted(iter)对可迭代对像进行排序
reversed(sequence)反转序列生成新的迭代器对象
zip(iter1,iter2)将iter1与iter2打包成元组并返回一个可迭代的zip对象
enumerate(iter)根据iter对象创建一个enumerate对象
all(iter)判断可迭代对象iter中所有元素的布尔值是否都为True
any(iter)判断可迭代对象的iter中所有元素的布尔值是否都为False
next(iter)获取迭代器的下一个元素
filter(function,iter)通过指定条件过滤序列并返回一个迭代器对象
map(function,iter)通过函数function对可迭代对象iter的操作返回一个迭代器对象
lst=[54,56,77,45,67,34]
#(1)排序操作
asc_lst=sorted(lst)  #升序
desc_lst=sorted(lst,reverse=True)  #降序
print('原列表:',lst)
print('升序:',asc_lst)
print('降序:',desc_lst)

#(2)reversed 反向
new_lst=reversed(lst)
print(type(new_lst))   #<class 'list_reverseiterator'> 迭代器对象
print(list(new_lst))

#(3)zip
x=['a','b','c','d']
y=[10,20,30,40,50]
zipobj=zip(x,y)
print(type(zipobj))  #<class 'zip'>
print(list(zipobj))

#(4)enumeraete
enum=enumerate(y,start=1)
print(type(enum))  #<class 'enumerate'>
print(tuple(enum))

#(5)all
lst2=[10,10,'',30]
print(all(lst2))  #False,空字符串的布尔值是False
print(all(lst))  #True

#(6)any
print(any(lst2))  #True

#(7)
#print(next(zipobj))

def fun(num):
    return num%2==1  #可能是True,False
obj=filter(fun,range(10)) #将range(10),0-9的整数,都执行一次fun操作
print(list(obj))  # [1, 3, 5, 7, 9]

def upper(x):
    return x.upper()
new_lst2=['hello','world','python']
obj2=map(upper,new_lst2)
print(list(obj2))

常用的其他内置函数

函数名称描述说明
format(value,format_apec将value以format_space格式进行显示
len(s)获取s的长度或s元素的个数
id(obj)获取对象的内存地址
type(x)获取x的数据类型
eval(s)执行s这个字符串所代表的Python代码
#format()
print(format(3.14,'20')) #数值型默认右对齐
print(format('hello','20'))  #字符串默认左对齐
print(format('hello','*<20')) #<左对齐,*表示的填充符,20表示的是显示的宽度
print(format('hello','*>20'))
print(format('hello','*^20'))

print(format(3.1415926,'.2f'))  #3.14
print(format(20,'b'))
print(format(20,'o'))
print(format(20,'x'))
print(format(20,'X'))

print('-'*40)
print(len('helloworld'))
print(len([10,20,30,40,50]))

print('-'*40)
print(id(10))
print(id('helloworld'))
print(type('hello'),type(10))

print(eval('10+30'))
print(eval('10>30'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值