小甲鱼python课后习题【16,17,18,19,20】

【学习笔记,仅供学习交流使用,知识源于鱼c论坛】

作业16:

测试题:

0、我们根据列表、元祖和字符串的共同特点,把它们三统称为什么?
序列
  1)都可以通过索引得到每一个元素
  2)默认索引值总是从0开始(当然灵活的Python还支持负数索引)
  3)可以通过分片的方法得到一个范围内的元素的集合
  4)有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)

1、请问分别使用什么BIF,可以把一个可迭代对象转换为列表、元祖和字符串?
  list(),tuple(),str()
  list([iterable]) 把可迭代对象转换为列表
  tuple([iterable]) 把可迭代对象转换为元祖
  str(obj) 把对象转换为字符串

1.  >>> temp = 'I love FishC.com!'
2.  >>> list(temp)
3.  ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'F', 'i', 's', 'h', 'C', '.', 'c', 'o', 'm', '!']

2、你还能复述出“迭代”的概念吗?
  所谓迭代,是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。

3、你认为调用 max(‘I love FishC.com’) 会返回什么值?为什么?
  会返回:‘v’,因为字符串在计算机中是以ASCII码的形式存储(ASCII对照表:http://bbs.fishc.com/thread-41199-1-1.html),参数中ASCII码值最大的是’v’对应的118。

4、哎呀呀,现在的小屁孩太调皮了,邻居家的孩子淘气,把小甲鱼刚写好的代码画了个图案,麻烦各位鱼油恢复下啊,另外这家伙画的是神马吗?怎么那么眼熟啊!??

1.  name = input('请输入待查找的用户名:')
2.  score = [['迷途', 85], ['黑夜', 80], ['小布丁', 65], ['福禄娃娃', 95], ['怡静', 90]]
3.  IsFind = False
4.   
5.  for each in score:
6.      if name in each:
7.          print(name + '的得分是:', each[1])
8.          IsFind = True
9.          break
10.     
11. if IsFind == False:
12.     print('查找的数据不存在!')

动动手:

0、猜想一下 min() 这个BIF的实现过程

def min(x):
      Least = x[0]
For each in x:
If each < least
least = each
return(least)

1、视频中我们说 sum() 这个BIF有个缺陷,就是如果参数里有字符串类型的话就会报错,请写出一个新的实现过程,自动“无视”参数里的字符串并返回正确的计算结果

 def sum(x):
    result = 0
    
    for each in x:
        if (type(each) == int) or (type(each) == float):
            result += each
        else:
            continue
 
    return result
 
print(sum([1, 2.1, 2.3, 'a', '1', True]))
    

2、请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

作业17:

测试题:

0、你有听说过DRY吗?
  DRY是程序员们公认的指导原则:Don’t Repeat Yourself.
  快快武装你的思维吧,拿起函数,不要再去重复拷贝一段代码了!

1、都是重复一段代码,为什么我要使用函数(而不使用简单的拷贝黏贴)呢?
  使用函数:
  0) 可以降低代码量(调用函数只需要一行,而拷贝黏贴需要N倍代码)
  1) 可以降低维护成本(函数只需修改def部分内容,而拷贝黏贴则需要每一处出现的地方都作修改)
  2) 使序更容易阅读(没有人会希望看到一个程序重复一万行“I love FishC.com”)

2、函数可以有多个参数吗?
   可以的,理论上你想要有多少个就可以有多少个,只不过如果函数的参数过多,在调用的时候出错的机率就会大大提高,因而写这个函数的程序员也会被相应的问候祖宗,所以,尽量精简吧,在Python的世界里,精简才是王道!

3、创建函数使用什么关键字,要注意什么?
  使用“def”关键字,要注意函数名后边要加上小括号“()”,然后小括号后边是冒号“:”,然后缩进部分均属于函数体的内容,例如:

1.  def MyFun():
2.      # 我是函数体
3.      # 我也是函数体
4.      # 我们都属于函数MyFun()
5.  # 噢,我不属于MyFun()函数的了

4、请问这个函数有多少个参数?

1.  def MyFun((x, y), (a, b)):
2.      return x * y - a * b

  如果你回答两个,那么恭喜你错啦,答案是0,因为类似于这样的写法是错误的!
  我们分析下,函数的参数需要的是变量,而这里你试图用“元祖”的形式来传递是不可行的。

  我想你如果这么写,你应该是要表达这么个意思:

1.  >>> def MyFun(x, y):
2.          return x[0] * x[1] - y[0] * y[1]
3.   
4.  >>> MyFun((3, 4), (1, 2))
5.  10

5、请问调用以下这个函数会打印什么内容?

1.  >>> def hello():
2.          print('Hello World!')
3.          return
4.          print('Welcome To FishC.com!')

  会打印:Hello World!
  因为当Python执行到return语句的时候,Python认为函数到此结束,需要返回了(尽管没有任何返回值)。

动动手:

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

 def power(x, y):
    result = 1
    for i in range(y):
        result *= x
    return result
print(power(2, 3))

小甲鱼python课后习题【16,17,18,19,20】_第1张图片
1、 编写一个函数,利用欧几里得算法(脑补链接)求最大公约数,例如gcd(x, y)返回值为参数x和参数y的最大公约数。

 def gcd(x, y):
    while y:
        t = x % y
        x = y
        y = t
    return x
    
print(gcd(4, 6))

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

 def Dec2Bin(dec):
    temp = []
    result = ''
    while dec:
        quo = dec % 2
        dec = dec // 2
        temp.append(quo)
    while temp:
        result += str(temp.pop())
    return result

print(Dec2Bin(62))

3、请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

作业18:

测试题:

0.请问以下哪个是形参哪个是实参?

def MyFun(x):  
    return x**3  
y = 3  
print(MyFun(y))  

  x 是形参,y 是实参。函数定义过程中参数是形参,调用函数过程中的参数是实参。

1、函数文档和直接用“#”为函数写注释有什么不同?
函数文档是为了让其他人能更好的理解使用你的函数。
  def MyFunction():
“这是一个函数文档,放在函数定义的最开头部分\n第二行”
  print(‘I Love You!’)
我们看到在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串, Ta的功能跟注释是一样的。

函数的文档字符串可以按如下方式访问:
  MyFunction.doc
‘这是一个函数文档,放在函数定义的最开头部分\n第二行’
另外,我们用help()来访问这个函数也可以看到这个文档字符串。
  help(MyFunction)
  Help on function MyFunction in module main:
  MyFunction()
这是一个函数文档,放在函数定义的最开头部分

2、使用关键字参数,可以有效避免什么问题的出现呢?

关键字参数是在调用函数时,带上函数参数的名字去指定调用哪个参数,从而不用按照参数的顺序调用参数。

不使用关键字参数可能出现以下现象:

def MyFunction1(he,she):  
    print('蒙多说%s是个大爷们'%he)  
    print('宝石说%s是个小娘们'%she)  
MyFunction1('拉克丝','德莱厄斯')  

蒙多说拉克丝是个大爷们
宝石说德莱厄斯是个小娘们
这样德莱厄斯的斧子可不答应喔,使用关键字参数即可,如下:

MyFunction1(she = '拉克丝',he ='德莱厄斯')  

蒙多说德莱厄斯是个大爷们
宝石说拉克丝是个小娘们

3、使用help(print)查看print()这个BIF有哪些默认参数?分别起到什么作用?

print(...)  
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)  
    Prints the values to a stream, or to sys.stdout by default.  
    Optional keyword arguments:  
    file:  a file like object (stream); defaults to the current sys.stdout.  
    #文件类型对象:默认是sys.stout(标准输出流)  
    sep:   string inserted between values, default a space.  
    #第一个参数如果有多个值(第一个参数是手收集参数),各个参数之间默认使用空格(space)隔开  
    end:   string appended after the last value, default a newline.  
    #打印最后一个值之后默认参数一个换行标志符(‘\n’)  
    flush: whether to forcibly flush the stream.  
    #是否强制刷新流  

4.默认参数和关键字参数表面最大的区别是什么?

  默认参数是在函数定义时就为形参赋予初值,若调用函数时没有为形参传递实参,则使用用默认参数。关键字参数是在调用函数时,传递实参时指定对应的形参。

动动手:

0、编写一个符合以下要求的函数:
a)计算打印所有参数的和乘以基数(base = 3)的结果
b)如果参数中最后一个参数为(base = 5),则设定基数为5,基数不参与求和运算。

def MyFunction2(*param, base = 3)
	'计算第一个参数的和,然后乘以第二参数的结果'  
    result = 0  
    for each in param:  
        result += each  
    result *= base  
    print('计算结果是:',result)  
MyFunction2(2,3,4,5,6)  

计算结果是: 60

1、寻找水仙花数
  题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3 + 5^3 + 3^3,因此153是一个水仙花数。编写一个程序,找出所有水仙花数。

def FindFlower():    
    '计算所有的水仙花数'    
    print('所有水仙花数:')    
    for each in range(100,1000):    
        baiwei = each//100    
        shiwei = (each - 100*baiwei)//10    
        gewei = each%10    
        count = baiwei**3 + shiwei**3 + gewei**3    
        if count == each:    
            print(each, end = '\t')    
    

FindFlower()
所有水仙花数:153 370 371 407

2.编写一个函数findstr(),该函数统计一个长度为2的字符串在另一个字符串出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,字符串为“im”,函数执行后打印“子字符串在目标字符串中共出现3次”。

def findstr(str1,str2):    
    '统计第一个字符串参数(长度为2)在第二个字符串参数出现次数'    
    length = len(str2)    
    count = 0    
    if str1 not in str2:    
        print('在目标字符串中未找到子字符串!')    
    else:    
        for each in range(length - 1):    
            if str2[each] == str1[0]:    
                if str2[each + 1] == str1[1]:    
                    count += 1    
    print('子字符串在目标字符串中共出现%d次' %count)    

  findstr(‘im’,‘You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.’)
  子字符串在目标字符串中共出现3次

作业19:

测试题:

0、下边程序会输出什么?

def next():  
    print('我在next()函数里...')  
    pre()  
  
def pre():  
    print('我在pre()函数里...')  
  
next()  

输出如下:
我在next()函数里…
我在pre()函数里…

1.请问以下这个函数有返回值吗?

def hello():  
    print('Hello FishC!')  

  这个函数返回值 None,python的函数都是有返回值的,所以17课的动动手的习题2才会那样打印的。
  print(hello())
  Hello FishC!
  None

2.请问Python的return语句可以返回多个不同类型的值吗?
  可以,默认用逗号隔开,是以元组的形式返回,也可以用列表包含起来返回。

def MyFunction():  
    return 1,'allen','小甲鱼'  
 MyFunction()  
(1, 'allen', '小甲鱼')  
def MyFunction():  
    return [1,'allen','小甲鱼']  
MyFunction()  
[1, 'allen', '小甲鱼']  

3.请目测以下程序会打印什么内容?

def fun(var):  
    var = 1314  
    print(var, end = '')  
  
var = 520  
fun(var)  
print(var)  

会打印1314520。因为函数对var的赋值操作只在函数内有效。

4.目测以下程序会打印什么内容?

var = 'Hi'  
  
def fun1():  
    global var  
    var = ' Baby '  
    return fun2(var)  
  
def fun2(var):  
    var += 'I love you'  
    fun3(var)  
    return var  
  
def fun3(var):  
    var = ' 小甲鱼 '  
  
print(fun1())  

结果如下:
Baby I love you

动动手:

0、编写一个函数,判断传入的字符串参数是否为“回文联”

def huiwen(string): 
    '判断传入的字符串是否为回文联' 
    list1 = list(string)  
    list2 = list(reversed(string))  
    if list1 == list2:  
        return '是回文联'  
    else:  
        return '不是回文联'  
  
print(huiwen('上海自来水来自海上'))  

运行结果:
是回文联

写程序的时候写错了一个版本,如下:

def huiwen(string):  
    '判断传入的字符串是否为回文联'
    list1 = list(string)  
    list2 = list1.reverse()  
    if list1 == list2:  
        return '是回文联'  
    else:  
        return '不是回文联'  
  
print(huiwen('上海自来水来自海上'))  

运行结果:
不是回文联
  原因是list的reverse()方法是返回None的,只会对列表内的元素逆序排序。而string的reserved()方法是会返回逆序后的字符串的。

1、编写一个函数,分别统计传入字符串参数(可能不止一个参数)的英文字母、空格、数字和其它字符的个数。

def tongji(*param):
    '判断传入的参数中英文字母,空格,数字,其他字符的个数'  
    length = len(param)  
    for i in range(length):  
        letters = 0  
        space = 0  
        number = 0  
        other = 0  
        for each in param[i]:  
            if each.isalpha():  
                letters += 1  
            elif each.isspace():  
                space += 1  
            elif each.isdigit():    
                number += 1    
            else:    
                other += 1    
        print('第%d个字符串共有:%d个英文字母,%d个空格,%d个数字,%d个其他字符'%(i+1,letters,space,number,other))     
    
tongji('1 love y0u~~~','i am better 1314 ### &1')    

运行结果:
第1个字符串共有:6个英文字母,2个空格,2个数字,3个其他字符
第2个字符串共有:9个英文字母,5个空格,5个数字,4个其他字符

作业20:

测试题:

0、如果希望在函数中修改全局变量的值,应该使用什么关键字?
  使用global关键字。
1、在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?
  使用nonocal关键字。

>>> def outside():  
           number = 4  
           def inside():  
               nonlocal number  
               number *= number  
               return number  
           return inside()  
         
>>> outside()  

打印结果:16

2、Python的函数可以嵌套,但是注意访问的作用域问题哦,请问以下代码存在什么问题?

def outside():  
       print('I am outside!')  
       def inside():  
              print('I am inside!')  
         
inside()  

函数嵌套中,内部函数只能在外部函数的范围内调用,改为:

def outside():  
       print('I am outside!')  
       def inside():  
              print('I am inside!')  
       inside()  
outside()

3.请问为什么代码A没有报错,但是代码B报错了?应该如何修改?代码A:

def outside():  
       var = 5  
       def inside():  
           var = 3  
           print(var)  
       inside()  
         
outside() 

代码B:

def outside():  
       var = 5  
       def inside():  
           print(var)  
           var = 3 
       inside()  
outside()  

  因为代码B中var没有定义就使用print打印var,外层函数的var变量内层函数不能访问。

4.请问如何访问funIn()呢?

def funOut():  
       def funIn():  
           print('宾果!你成功访问到我啦')  
       return funIn()  

直接调用funOut函数即可:
funOut()
宾果!你成功访问到我啦

5.请问如何访问funIn()呢?def funOut():

   def funIn():  
       print('宾果!你成功访问到我啦')  
   return funIn  

得加一个小括号:

>>> print(funOut())  
<function funOut.<locals>.funIn at 0x0000021DADD9E9D8>  
>>> type(funOut())  
<class 'function'>  
>>> funOut()()  

宾果!你成功访问到我啦
我觉得funOut函数返回的funIn类似C语言中的函数名,是一个地址。

6.以下是“闭包”的一个例子,请你目测下会打印什么内容?,

def funX():  
       x = 5  
       def funY():  
           nonlocal x  
           x += 1  
           return x  
       return funY  
 
a = funX()     
print(a())  
print(a())  
print(a())  

打印6,7,8。只要认为funX()函数返回的是funY()的地址就能理解了,a()只不过是调用funY()。

你可能感兴趣的:(小甲鱼python课后习题【16,17,18,19,20】)