21函数4
一、lambda匿名函数
1、函数表达式
>>> lambda x : 2*x+1
# 参数 :返回值
>>> g = lambda x : 2*x+1
>>> g(5)
11
>>> f = lambda x,y :x+y
2、感受一下使用匿名函数后给你的编程生活带来的变化?
1)Python写一些执行脚本时,使用lambda就可以省下定义函数的过程,比如说我们只是需要写一个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用lambda就可以使得代码更加精简。
2)对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候我们个函数起个名字也是比较头疼的问题,使用lambda就不需要考虑命名问题。
3)简化代码的可读性,由于普通的函数阅读经常要跳到开头def定义部分,使用lambda函数可以省去这样的步骤。
二、 filter()过滤器函数
#filter有两个参数
filter(函数或者None,可迭代的数据)
#如果第一个参数为函数,则将每一个可迭代数据里的每一个元素,作为函数的参数进行计算,返回计算结果为True的结果,并将其筛选出来合并为一个列表。
#如果第一个参数为None,则将数据里的True筛选出来。
>>> filter(None,[1,0])
<filter object at 0x0000018F6AEBB358>
>>> print(filter(None,[1,0]))
<filter object at 0x0000018F6AE34E80>
>>> list(filter(None,[1,0]))
[1]
#将lambda函数运用到filter函数
>>> list(filter(lambda x : x%2 , range(10)))
[1, 3, 5, 7, 9]
#上述过程等效为下方过程
>>> def odd(x):
return x%2
>>> temp = range(10)
>>> show = filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
三、map()映射函数
map() 会根据提供的函数对指定序列做映射。
第一个参数 function ,以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。map(function, iterable, …),function – 函数,iterable – 一个或多个序列,以下实例展示了 map() 的使用方法:
#map有两个参数
map(函数或者None,可迭代的数据)
>>>def square(x) : # 计算平方数
return x ** 2
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
>>> list(map(lambda x,y:[x,y] , [1,3,5,7,9] , [2,4,6,8,10]))
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
22递归0
一、定义
1、递归必须满足哪两个基本条件?
递归需要满足:调用自身;有停止条件。
2、python3默认递归的深度是100层,可以通过以下代码修改:
>>> import sys
>>> sys.setrecursionlimit(1000)
3、思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?
例如:汉诺塔,目录索引(因为你不知道目录里是否还有目录),树结构的定义等.
4、用递归去计算阶乘问题或斐波那契数列是很糟糕的算法,你知道为什么吗?
因为递归是函数调用自身,每一次调用都要进行压栈和出栈,需要很多时间和内存资源。
二、作业
0、使用递归编写一个power()函数内建函数pow(),即power(x,y)为计算并返回x的y次幂的值。pow(x,y):是表示x的y次幂。pow(x,y,z):是表示x的y次幂后除以z的余数
print('-----------------22zuoye0------------')
def power(x,y) :
if y == 1 :
return x
else :
return x *power(x,y-1)
x = int(input('请输入x的值:'))
y = int(input('请输入y的值:'))
result = power(x,y)
print('%d的%d次幂的值为%d' % (x,y,result))
1、使用递归编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x,y)返回值为参数x和参数y的最大公约数。
print('--------------------22zuoye1-------------')
def gcd(x,y) :
if y > 0 :
yushu = x%y
x = y
y = yushu
return gcd(x,y)
else :
return x
x = int(input('请输入x:'))
y = int(input('请输入y:'))
result = gcd(x,y)
print('最大公约数为%d' % result)
23递归1
一、斐波那契数列
1、迭代实现斐波那契数列
print('---------------23课堂0-----------')
#迭代实现斐波那契数列
def fun1(x) :
if x == 1 or x == 2:
return 1
else :
y = [1,1]
for i in range(3,x+1) :
y.append(y[i-3]+y[i-2])
return y
x = int(input('请输入经过了多少个月的繁殖:'))
result = fun1(x)
print('总共有%d对兔子' % result[x-1])
2、递归实现斐波那契数列
print('---------------23课堂1-------------')
#递归实现斐波那契数列
def fun1(x) :
if x == 1 or x == 2 :
return 1
else :
return fun1(x-1) + fun1(x-2)
x = int(input('请输入经过了多少个月的繁殖:'))
result = fun1(x)
print('总共有%d对兔子' % result)
24递归2
一、汉诺塔
print('---------24课堂0------------')
#递归求汉诺塔搬运次数
def hanoi(x) :
if x == 1 :
return 1
else :
return 1 + 2 * hanoi(x-1)
print('-------------24课堂1--------------')
#递归求汉诺塔实现过程
def hanoi(n,x,y,z) :
if n == 1 :
print(x,'-->',z)
else :
hanoi(n-1,x,z,y)
print(x,'-->',z)
hanoi(n-1,y,x,z)
n = int(input('请输入汉诺塔的层数:'))
hanoi(n,'X','Y','Z')
二、课后题
0、使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。
def fun1(x) :
if x == 0 :
return ''
else :
yushu = x % 2
return fun1(x//2) + '%d' % yushu
1、写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==>[1, 2, 3, 4, 5]
解题思路:利用除以10取余数的方式,每次调用get_digits(n//10),并将余数存放到列表中即可。要注意的是结束条件设置正确。
def get_digits(n):
result = ''
if n:
result = get_digits(n//10)
result += str(n%10)
return list(result)
num = int(input('请输入一个数:'))
print(get_digits(num))
2、还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能傲娇的说我可以吗?
解题思路:有好多种方法,不过综合效率来说,小甲鱼的实现方式比较朴素,利用递归每次索引前后两个字符进行对比,当start > end的时候,也正是首尾下标“碰面”的时候,即作为结束递归的条件。
参考答案:
def Huiwen(temp,start,end):
if start > end:
return 1
else:
if temp[start]==temp[end]:
return Huiwen(temp,start+1,end-1)
else:
return 0
temp = input('请输入一段文字:')
length = len(temp)
end = len(temp)-1
if Huiwen(temp,0,end):
if temp[0:length//2] == temp[length//2:length]:#解释如图所示
print('%s不是一个回文字符串!'%temp)
else:
print('%s是一个回文字符串!'%temp)
else:
print('%s不是一个回文字符串!'%temp)
自己的代码:
print('------------------23&24zuoye2--------------')
def huiwen(x) :
length = len(x)
if length == 0 or length == 1 :
print('是回文符')
else :
str1 = x[0]
str2 = x[length-1]
if str1 == str2 :
return huiwen(x[1:length-1])
else :
print('不是回文符')
3、使用递归编程求解以下问题:
自己的代码:
print('------------------23&24zuoye3--------------')
def age(x) :
if x == 1 :
return 10
else :
age5 = age(x-1) + 2
return age5
25字典0
一、字典
字典是映射类型,区别于序列类型(通过索引值求数组值)。 字典由键和值组成。
二、创建和访问字典
创建:
dict1={‘F’:70,‘c’:67,‘h’:104,‘i’:105,‘s’:115}
或者利用dict关键字
dict2=dict(((‘s’,115),(‘i’,105),(‘c’,67)))
或者
dict3=dict(s=115,i=105,c=67) #没有引号
访问:
>>> dict1[‘c’]
67
2、用方括号(“[]”)括起来的数据我们叫列表,那么使用大括号(“{}”)括起来的数据我们就叫字典对吗?
answer:不对
a={1,2,3,4,6}
type(a)
<class ‘set’>
不难发现,我们用大括号“{}”把一些数据括起来了,但是由于没有反应出这些数据有映射关系,所以创建出来的不是字典,而是叫‘set’的东西。
3、你是如何理解有些东西字典做得到,但是万能的列表却难以实现了呢?
比如李宁:口号为一切皆有可能,需要用利用关键字去访问口号,这种情况下列表难以做到,就是两个有关联的东西用字典做起来比较方便一些。
4、下边这些代码,他们都在执行一样的操作,你能看出区别么?
a=dict(one=1,two=2,three=3)
b={'one':1,'two':2,'three':3}
c=dict(zip(['one','two','three'],[1,2,3]))
d=dict([('two',2),('one',1),('three',3)])
e=dict({'three':3,'one':1,'two':2})
都可以用来创建字典,没什么区别
三、课后题
0、创建对应id姓名性别的字典
data = '1000,小甲鱼,男'
Mydict = {}
(Mydict['id'],Mydict['姓名'],Mydict['性别']) = data.split(',')
1、尝试用字典的特性编写一个通讯录程序
print('欢迎进入通讯录程序')
print('1.查询联系人')
print('2.插入联系人')
print('3.删除联系人')
print('4.退出通讯录')
contact={'小王':123,'小李':254,'小张':125,'小徐':785}
while 1:
temp=int(input("请输入你的选择:"))
if temp==1:
name=input("请输入要查询的姓名:")
if name in contact.keys():
print(contact[name])
else:
print("该联系人不在通讯录中")
if temp==2:
name=input("请输入要添加的联系人姓名:")
number=input("请输入联系人电话:")
contact[name]=number
if temp==3:
name=input("请输入要删除的联系人姓名:")
if name in contact.keys():
contact.pop(name)
else:
print("该联系人不在通讯录中")
if temp==4:
break
print('|----感谢使用通讯录程序-----|')