Python小甲鱼学习笔记21-25

21函数4一、lambda匿名函数1、函数表达式>>> lambda x : 2*x+1# 参数 :返回值>>> g = lambda x : 2*x+1>>> g(5)11>>> f = lambda x,y :x+y2、感受一下使用匿名函数后给你的编程生活带来的变化?  1)Python写一些执行脚本时,使用lambda就可以省下定义函数的过程,比如说我们只是需要写一个简单的脚本来管理服务器时间,我们就不需
摘要由CSDN通过智能技术生成

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('|----感谢使用通讯录程序-----|')

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值