目录
四、掌握变量的作用域
✍变量的作用域
指变量起作用的范围作用的大小可分为局部变量和全局变量
局部变量 | 全局变量 |
---|---|
定义:在函数定义处的参数和函数内部定义的变量 | 定义:在函数外定义的变量或函数内部使用global关键字修饰的变量 |
作用范围:仅在函数内部,函数执行结束,局部变量的生命周期也结束 | 作用范围:整个程序,程序运行结束,全局变量的生命周期才结束 |
# 局部变量
def calc(a,b):
s=a+b
return s
result=calc(10,20)
print(result)
# print(a,b,s) # a.b是函数的参数,参数是局部变量,s函数中定义的使用,局部变量
# 全局变量
a=100
def calc(x,y):
return a+x+y
print(a)
print(calc(10,20))
print('-'*30)
def calc2(x,y):
a=200 # 局部变量,局部变量的名称和全局变量的名称相同
return a+x+y # a是局部变量,当全局变量和局部变量的名称相同时,局部变量的优先级更高。
print(calc2(10,20))
print(a)
print('-'*30)
def calc3(x,y):
global s # s是在函数中定义的变量,但是使用了global关键字声明,这个变量s变成了全局变量
s=300 # 声明和赋值,必须分开执行
return s+x+y
print(calc3(10,20))
print(s)
五、熟悉匿名函数lambda的使用
✍lambda函数
是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化。
语法结构:
result=lambda参数列表:表达式
def calc(a,b):
return a+b
print(calc(10,20))
# 匿名函数
s=lambda a,b:a+b # s 表示就是一个匿名函数
print(type(s)) # <class 'function'>
# 调用匿名函数
print(s(10,20))
print('-'*30)
# 列表的正常取值操作
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':'蟹老板','score':98},
{'name':'痞老板','score':95},
{'name':'章鱼哥','score':100},
{'name':'海绵宝宝','score':90}
]
# 对列表进行排序,排序的规则 是字典只的成绩
student_scores.sort(key=lambda x:x.get('score'),reverse=True) # 降序
print(student_scores)
✍递归函数
- 在一个函数的函数体内调用该函数本身,该函数就是递归函数。
- 一个完整的递归操作由两部分组成,一部分是递归调用,一部分是递归终止条件,一般可使用if-else结构来判断递归的调用和递归的终止。
N*fac(N-1)
def fac(n): # n的阶乘 N!=N*(N-1)!.......1!=1
if n==1:
return 1
else:
return n*fac(n-1) # 自己调用自己
print(fac(5))
✍斐波那契数列
斐波那契数列又称黄金分割线,是由数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、......,从第三项开始,每项都等于前两项之和。
公式为:f(n)=f(n-1)+f(n-2)
def fac(n):
if n==1 or n==2:
return 1
else:
return fac(n-1)+fac(n-2)
print(fac(9)) # 第9位上的数字
for i in range(1,10):
print(fac(i),end='\t')
print()
六、熟悉常用的内置函数
✍数据类型转换函数
函数名称 | 描述说明 |
---|---|
bool(obj) | 获取指定对象obj的布尔值 |
str(obj) | 将指定对象obj转成字符串类型 |
int(x) | 将x转成int类型 |
float(x) | 将x转成float类型 |
list(sequence) | 将序列转成列表类型 |
tuple(sequence) | 将序列转成元组类型 |
set(sequence) | 将序列转成集合类型 |
✍常用的数学函数
函数名称 | 描述说明 |
---|---|
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位小数,结果四舍五入 |
print('绝对值:',abs(100),abs(-100),abs(0))
print('商和余数:',divmod(13,4))
print('最大值:',max('hello'))
print('最大值:',max([10,4,56,78,4]))
print('最小值:',min('hello'))
print('最小值:',min([10,4,56,78,4]))
print('求和:',sum([10,34,45]))
print('x的y次幂:',pow(2,3))
# 四舍五入
print(round(3.1415926)) # round函数只有一个参数,保留整数
print(round(3.9415926)) # 4
print(round(3.1415926,2)) # 3.14 ,2表示的是保留两位小数
print(round(314.15926,-1)) # 310 ,-1位,个数进行四舍五入
print(round(314.15926,-2)) #300 ,-2,十位进行四舍五入
✍常用的迭代器操作函数
函数名称 | 描述说明 |
---|---|
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,4,567,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)enumerate
enum=enumerate(y,start=1)
print(type(enum)) # <class 'enumerate'>
print(tuple(enum))
# (5)all
lst2=[10,20,'',30]
print(all(lst2)) # False ,空字符串的布尔值是False
print(all(lst)) # True
# (6)any
print(any(lst2)) # True
# (7)
print(next(zipobj))
print(next(zipobj))
print(next(zipobj))
def fun(num):
return num%2==1
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_spec) | 将value以format_spec格式进行显示 |
len(s) | 获取s的长度或s元素的个数 |
id(obj) | 获取对象的内存地址 |
type(x) | 获取x的数据类型 |
eval(s) | 执行s这个字符串所展示的python代码 |
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'))
print(format(20,'b'))
print(format(20,'o'))
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'))
总结
✍函数是将一段实现功能的完整代码,使用函数名称进行封装,通过函数名称进行调用
✍函数定义的语法结构
def 函数名称(参数列表):
函数体
[return返回值列表]
✍函数的调用:
- 不带返回值的函数直接调用
- 带返回值的函数调用之后要将结果保存到变量中
✍函数参数的类型
ி 函数定义处的参数称为形式参数,形式参数可以定成:
- 位置参数
- 默认值参数
- 可变参数
ி 函数调用处的参数称为实际参数,在进行参数传递时可以使用关键字参数传参或位置参数传参
✍按照变量的作用域可分为:局部变量和全局变量
✍只有一句函数体的函数可以使用匿名函数(lambda)替代
✍递归的组成部分:递归调用与递归终止条件,可以使用if......else结构实现
✍常用的内置函数可分为:数据类型转换函数、数学函数、迭代器操作函数和其他函数