作业21:

测试题:

0、请使用lambda表达式将下边函数转变为匿名函数?
def fun_A(x,y=3):
  return x*y

result=lambda x,y=3 : x*y

1、请将下边的匿名函数转变为普通的屌丝函数?
  lambda x:x if x%2 else None
屌丝函数:

def add(x):
   if x%2:
     return x
  else:
    return None

2、感受一下使用匿名函数后给你的编程生活带来的变化?
  1)Python写一些执行脚本时,使用lambda就可以省下定义函数的过程,比如说我们只是需要写一个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用lambda就可以使得代码更加精简。
  2)对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候我们个函数起个名字也是比较头疼的问题,使用lambda就不需要考虑命名问题。
  3)简化代码的可读性,由于普通的函数阅读经常要跳到开头def定义部分,使用lambda函数可以省去这样的步骤。

3、你可以利用filter()和lambda表达式快速求出100以内所有3的倍数吗?

  filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。filter(function, iterable) 。function – 判断函数。iterable – 可迭代对象。返回一个迭代器对象。

  print(list(filter( lambda x:x%3 == 0 , range(1,100))))

[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

  lambda x:x%3==0

python 小甲鱼课后题 python小甲鱼课后作业大全_git

4、还记得列表推导式吗?完全可以使用列表推导式代替filter()和lambda组合,你可以做到吗?

[x for x in range(1,100)if x%3==0]

python 小甲鱼课后题 python小甲鱼课后作业大全_python 小甲鱼课后题_02


for x in range(1,100):

if x%3 == 0:

x

5、还记得zip吗?使用zip会将两数以元祖的形式绑定在一块,例如:
list(zip([1,3,5,7,9],[2,4,6,8,10]))
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
但如果我希望打包的形式是灵活多变的列表而不是元组(希望是[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]这种形式),你能做到吗?

  list(map(lambda x,y : [x,y],[1,3,5,7,9],[2,4,6,8,10]))
  map() 会根据提供的函数对指定序列做映射。
  第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。map(function, iterable, …),function – 函数,iterable – 一个或多个序列,以下实例展示了 map() 的使用方法:

>>>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]]

6、请目测以下表达式会打印什么?

def make_repeat(n):
   return lambda s : s*n
double = make_repeat(2)
print(double(8))
print(double('FishC'))

打印结果:
16
FishCFishC

作业22:

测试题:

0、递归在编程上的形式是如何表现的呢?
  递归形式上就是在函数体里调用自身。如下所示:

def fun():
       return fun()

  不过这样是不行的,因为没有停止条件,IDLE会一直报错,直到你按下Ctlr + C。python3默认递归的深度是100层,可以通过以下代码修改:

>>> import sys
>>> sys.setrecursionlimit(1000)

1、递归必须满足哪两个基本条件?
  递归需要满足:调用自身;有停止条件。

2、思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?
  例如:汉诺塔,目录索引(因为你不知道目录里是否还有目录),树结构的定义等.

3、用递归去计算阶乘问题或斐波那契数列是很糟糕的算法,你知道为什么吗?
  因为递归是函数调用自身,每一次调用都要进行压栈和出栈,需要很多时间和内存资源。

4、请聊一聊递归的优缺点(无需官方陈词,想到什么写什么就可以)
  优点:可以使代码简洁;在解决一些问题,如汉诺塔问题时比较方便
  缺点:使用上需要谨慎,因为会占用大量时间和资源;还有可能因为停止条件设置不合适而导致内存爆满。

5、拿手机拍一张“递归自拍照片”
  拍这个的话需要两面镜子,那会是一个没有停止条件的递归,无限循环反射下去。

动动手

0、使用递归编写一个power()函数内建函数pow(),即power(x,y)为计算并返回x的y次幂的值。

def power(x,y):
       if y > 0:
              return x*power(x, y-1)
       else:
              return 1
#测试代码及结果:
for x in range(2,6):
       for y in range(6):
              print(pow(x,y) == power(x,y),power(x,y), end = "\t")

python 小甲鱼课后题 python小甲鱼课后作业大全_python_03


pow(x,y):是表示x的y次幂。

pow(x,y,z):是表示x的y次幂后除以z的余数

1、使用递归编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x,y)返回值为参数x和参数y的最大公约数。

def gcd(x,y):
       if y > 0:
              yushu = x%y
              x = y
              y = yushu
              return gcd(x,y)
       else:
              return x
print (gcd(24,30))

测试代码及结果:6

作业23 and 24:

动动手:

0、使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。

def Bin(n):
    temp = ''
    if n:
        temp = Bin(n//2)
        temp += str(n%2)
        return temp
    else:
        return temp        
num = int(input('请输入一个十进制数:'))
print(num,'-->',Bin(num))

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)

python 小甲鱼课后题 python小甲鱼课后作业大全_回文字符串_04


3、使用递归编程求解以下问题:

python 小甲鱼课后题 python小甲鱼课后作业大全_python 小甲鱼课后题_05

def Age(n):
    if n == 1:
        return 10
    if n > 1:
        age = 10
        age = Age(n-1) + 2
        return age
num = int(input('请输入要查询的编号:'))
print('第%d个人的年龄是:%d'%(num,Age(num)))

作业25:

测试题:

0、当你听到小伙伴们在谈论“映射”、“哈希”、“散列”或者“关系数组”的时候,事实上他们就是在讨论什么呢?
  answer:字典
1、 尝试将一下数据(‘F’:70,’C’:67,’h’:104,’i’:105,’s’:115)创建为一个字典并访问键‘C’对应的值?
创建
dict1={‘F’:70,‘c’:67,‘h’:104,‘i’:105,‘s’:115}
或者利用dict关键字
dict1=dict(((‘s’,115),(‘i’,105),(‘c’,67)))
或者
dict1=dict(s=115,i=105,c=67)

访问:
dict1[‘C’]
报错

访问:

dict1[‘c’]

返回:

67

python 小甲鱼课后题 python小甲鱼课后作业大全_递归_06


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})

都可以用来创建字典,没什么区别

5、如图,你可以推测出打了马赛克部分的代码吗?

python 小甲鱼课后题 python小甲鱼课后作业大全_git_07


data.split(’,’)

动一动:

0、尝试用字典的特性编写一个通讯录程序

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