python基础升级版第三课练习与作业

python基础升级版第三课练习与作业

习题1

定义一个函数,接收任意3个数字的输入,并按顺序从小到大输出

def sortPrint(num1,num2,num3):
    if(not ((type(num1)==int or type(num1)==float)\
        and (type(num2)==int or type(num2)==float)\
        and (type(num3)==int or type(num3)==float))):
        print("error: args num1-3 must be digital!")
        return
    if num1>num2:
        num1,num2 = num2,num1 #第一次 让 num1 < num2
    if num2>num3:
        num2,num3 = num3,num2 #保证num3 最大
    if num1>num2:
        num1,num2 = num2,num1 #再确保 num1 最小
    print(num1,num2,num3)

调用测试

sortPrint(3.0,1,55.0)

结果 1 3.0 55.0

sortPrint("abc",2,3)

结果 error: args num1-3 must be digital!

l1 = [3,54.9,29]
sortPrint(*l1)

结果 3 29 54.9

习题2

'''
要求创建一个函数,它可以接收,位置参数,
不定长位置参数,不定长关键词参数,并按
要求输出 。
 输入班级名,班级特色(如 ’勤奋’,’颜值高’)
等等不同特色,班级不同同学的姓名与年龄。
 要求输出,班级名,班级特色,班级成员,
班级成员的平均年龄。
'''

def myClass(className,*classArgs,**kwArgs):
    print("班级名:",className)
    print("班级特色:",end="")
    for item in classArgs:
        print(item,end=",")
    print("\n班级成员:",end="")
    totalAge = 0
    for name,age in kwArgs.items():
        print(name,end=",")
        totalAge += age
    print("\n平均年龄:",round(totalAge/len(kwArgs),1))

调用测试

myClass("高三一班","美丽","大方","阳刚","有理想",**{"张三":18,"李四":19,"赵二":16})

结果

班级名: 高三一班

班级特色:美丽,大方,阳刚,有理想,

班级成员:张三,李四,赵二,

平均年龄: 17.7

习题3

使用 reduce 函数实现找出一组数字列表中的最大值

from functools import reduce
def findMax(listNum):
    return reduce(lambda a,b:a if a<b else b,listNum)

测试调用

findMax([89,12.2,1,-2,9,-1.5])

结果 -2

习题4

求 1000 以内能同时被 3 和 7 整除的数有哪些。

要求使用 map 与 filter 函数

1-filter方法

list(filter(lambda x:x%3==0 and x%7==0,range(1,1000)))

结果

[21,

 # 42,
 # 63,等等

2-map方法

L1 = list(map(lambda x:(x,1 if x%3==0 and x%7==0 else 0),range(1,1000)))
L2 = [x[0] for x in L1 if x[1]!=0]
print(L2)

结果, 将符合要求的标记为1

[21, 42, 63, 84, ...
 

习题5

体现闭包的思想,创建一个三层嵌套的函数,并调用

思路:传入斐波那契数列,第1层内嵌函数计算 F(n+1)/F(n),

第2层内嵌计算F(n+1)/F(n) - 1,就是增长率

def Fb(*args):
    L1 = list(args)
    L2 = L1[1:]
    L2.append(L2[-1]+L2[-2])
    def Fb1():
        L3 = list(map(lambda a,b:b/a,L1,L2))
        def Fb2():
            return list(map(lambda x:x-1,L3))
        return Fb2
    return Fb1

测试调用

Fb(1,1,2,3,5,8,13,21,34,55)()()

结果 [0.0, 1.0, 0.5, 0.6667, 0.6, 0.625, 0.6154, 0.619, 0.6176, 0.6182]

结果趋向 0.618黄金分割

习题6

请以 round 函数,定义一个偏函数 roundN ,调用

为输入一个数字 N ,返回圆周率后 N 位的数字

提示 : import math math.pi

from functools import partial
import math
roundN = partial(round,math.pi)

测试调用

roundN(10)

结果 3.1415926536

习题7

请以 sorted 函数,定义一个偏函数 sortedDESC ,

结果为输入一个序列,返回为按降序排列后序列。

import functools
sortedDESC = functools.partial(sorted,reverse=True)

测试调用

sortedDESC([5,3,1,2,9,10])

结果 [10, 9, 5, 3, 2, 1]

习题8

要求使用 map 与 filter 函数,输出一个输入字

符串里每个字符出现的次数

提示:结合 dict 使用实现

方法1:使用 map 和 filter

def count_str(s):
    L1 = list( map( lambda a,b:(a,s.count(a),1 if b==s.index(a) else 0), s, range(len(s)) ))
    L2 = list( filter( lambda x:x[2]==1, L1 ))
    L3 = list( map( lambda x:(x[0],x[1]) , L2 ) )
    return L3

a = "abaabbc"
print(count_str(a))

结果 [('a', 3), ('b', 3), ('c', 1)]

方法2:使用 map 和 reduce

import functools
def count_str(s):
    L1 = list( map( lambda x:(x,s.count(x)), s ) )
    return functools.reduce( lambda a,b:a+[b] if(b not in a) else a,[[],] + L1)
    
a = "abaabbc"
print(count_str(a))

结果 [('a', 3), ('b', 3), ('c', 1)]

习题9

创建一个能够快排的递归函数

L1 = [3,2,1,4,9,11,12,2,3,1,22]

def quickSort(LS,left,right):
    if right-left<=0:return
    base = left
    base_val = LS[base]
    i = left
    j = right
    while(j>i):
        while(j>i):
            if(LS[j]<base_val):break
            j -= 1
        while(j>i):
            if(LS[i]>base_val):break
            i += 1
        if(j>i):#交换 i j的元素
            tmp=LS[i];LS[i]=LS[j];LS[j]=tmp;
        else:#交换 base 和 i
            LS[left]=LS[i];LS[i]=base_val;
    #左子列 递归
    quickSort(LS,left,i-1)
    #右子列 递归
    quickSort(LS,i+1,right)

print(L1)
quickSort(L1,0,len(L1)-1)
print(L1)

结果:

[3, 2, 1, 4, 9, 11, 12, 2, 3, 1, 22]

[1, 1, 2, 2, 3, 3, 4, 9, 11, 12, 22]

习题10

创建一个能打印一个字典中包含所有字典对象的递归函数

dic = {
" 北京 ": {
" 东城 ": [" 天坛 ", " 东单 ", " 王府井 "],
" 西城 ": [" 西单 ", " 军博 ", " 复兴门 "],
},
" 上海 ": {
" 杨浦 ":[" 五角场 "," 政通路 "," 世界路 "]
},
" 天津 ":[" 天津港 "]
}

def print_dict(dicArg):
    if(type(dicArg) != dict):
        print("Arg is not a dict!")
        return
    for key,value in dicArg.items():
        print("{",key,":",end='')
        if(type(value)==dict):
            print_dict(value)
        else:
            print(value,"}")

测试

print_dict(dic)

结果:

{ 北京 :{ 东城 :[' 天坛 ', ' 东单 ', ' 王府井 '] }

{ 西城 :[' 西单 ', ' 军博 ', ' 复兴门 '] }

{ 上海 :{ 杨浦 :[' 五角场 ', ' 政通路 ', ' 世界路 '] }

{ 天津 :[' 天津港 '] }

习题11

编写一个生成器,实现 fib 数列的效果

def FB(nums):
    i = 0
    numsnow = nums2 = nums1 = 0
    while(i<=nums):
        if i==0: yield numsnow
        elif i==1: numsnow = 1;nums1 = numsnow; yield numsnow
        else:
            numsnow = nums1 + nums2
            nums2 = nums1
            nums1 = numsnow
            yield numsnow
        i += 1

测试

f = FB(10)
for i in range(11):
    print(next(f))

结果

0

1

1

2

3

5

8

13

21

34

55

作业

创建一个能接收不定长位置参数(数字)函

数,返回是所有参数的和。

 现要求在这个函数每次调用时都有进行屏幕

打印(该函数被调用)。

 请在不改动这个函数内部及调用的前提下实

现。

import datetime
def extrafunc(func):
    def inner():
        print("extrafunc:",datetime.datetime.now(),"run:",func.__name__)
        return func
    return inner()

@extrafunc
def mysum(*args):
    sum_total = 0
    for item in args:
        if not (type(item)==int or type(item)==float):
            print("item",item,"is not a int or float!")
            return
        sum_total += item
    return sum_total

测试

print(mysum(1,2,10,10))

结果

extrafunc: 2017-12-06 15:14:21.986929 run: mysum

23


1 个评论

哇。。闭包那题,把增长率都体现了。棒~~~

fib数列生成器那题,可以再精简一些。

装饰器那题,要是能体现被装饰函数的返回结果 就更棒了。

另外,你对程序的健壮性的设计非常好。

要回复文章请先登录注册

返回顶部