函数、装饰器、迭代器、内置方法总练习题

函数基础:

1.写函数,计算传入数字参数的和。(动态传参):用不固定参数的*args不限定输入的参数,然后用for循环把每个元素加到一起,函数里的args不用加*


def sum1(*args):
j = 0
for i in args: # 不固定参数输入元祖后,调用不需要加*
j = j + i
print(j)

sum1(1,2,3,4,5,6)
 

2.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作:原来打算打开文件后,遍历每行数据,每行数据为字符串S--》每行数据用,分割成元素为字符串的列表A--》判断是否需要修改--》修改后赋值给原来的列表A--》再把列表A用',’.join(list)转成也就是原来的字符串S--》再用seek,truncate写回原来文件。

也就是说不用弄一个空列表就能实现修改信息写回文件,然而写的时候发现问题出在--》修改后赋值给原来的列表A  这里,要赋值就要再用一次循环,然后用到枚举enumerae来定位索引值,而枚举列表的元素类型为str,刚好原来列表A的元素也是字符串,字符串是不可变的元素,不能通过枚举索引修改元素,所以还是得弄一个空列表l,把修改后的信息加到空列表l里--》做完后感觉用字典的话应该不用像列表一样做这么多for循环,因为字典索引是用key,赋值不用index索引去找

用到的东西:str.split(','),list.append(str),文件写入方法(for i in list ,f.write('\n),seek(0),truncate()),for index,i in enuerate(list) -->if correction-->list[index] = i

def file_change(filename,newinfo,oldinfo):
f = open(filename,'r+')
d = f.readlines() # 信息变成列表,元素是一个一个的字符串,一个字符串就是一行
l = []
n = 0
for i in d:
for i1, e in enumerate(i): # di是每行信息字符串的列表i
e = i.split(',') # 把每行信息字符串变成以,隔开的列表e
# print(i)
for index2,j in enumerate(e):
if j == oldinfo:
j = newinfo # 每个小的字符串检查,如果有符合的替换掉
e[index2] = j # 通过索引方式把修改后的值赋值回遍历的列表e
n += 1 # 加一个功能,计算修改的次数
e2 = ','.join(e) # 把列表e用,重新组成字符串e2
l.append(e2) # e2加到空列表l
# print(l)
f.seek(0)
f.truncate() # 清空文件内容
f = open(filename, 'w')
for k in l:
f.write('{}\n'.format(k)) # i信息重新写入
f.close()
file_change('D:test.txt','AAA','BBB')

3.写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。:all(),any()只能判断可迭代对象

def check(n):
print('没有空内容') if all(n) else print('有空内容')

check(None)
TypeError: 'NoneType' object is not iterable


4.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

用到:dict.keys(),dict.values(),dict.items()--K,V

dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表

dic = {"k1": "v1v1", "k2": [11,22,33,44]}
def check(i):
for k,v in i.items():
if len(v) > 2:
i[k] = v[:2]
print(i)

check(dic)

答案用的return i和else continue有什么作用?不用输出也是一样

 

解释闭包的概念

不懂,回去再看一遍

 

写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组

例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)]

def poke():
color = ['红心','草花','红桃','黑桃']
n = 1
l = []
while n < 14:
for i in color:
l.append((i, n))
  n += 1
print(l)

poke()

然后再加上if对i的判断
def poke():
i =[]
color = ['红心','草花','红桃','黑桃']
num = [i for i in range(2,11)]
num_big = ['J','Q','K','A']
num.extend(num_big) # 1-13数字集合到一起
k = []
for i in num:
for l in color:
k.append((l,i)) # 实际和99乘法一样
print(k)


poke()


这种就没事
 

2写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}

例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}

3写函数,专门计算图形的面积

其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积

调用函数area(‘圆形’,圆半径) 返回圆的面积

调用函数area(‘正方形’,边长) 返回正方形的面积

调用函数area(‘长方形’,长,宽) 返回长方形的面积

def area(): def 计算长方形面积(): pass def 计算正方形面积(): pass def 计算圆形面积(): pass

def area(typ, *args):
def recangle(x,y):
num = x*y
return num
def square(x):
num = x*x
return num
def circular(x):
num = x
return num
if typ == '长方形':
return recangle(*args)
elif typ == '正方形':
return square(*args)
elif typ == '圆形':
return circular(*args)



print(area('长方形',5,6))

return函数的应用,return是指返回函数的执行结果。 import math ,pi表示3.14

写函数,传入一个参数n,返回n的阶乘(用for循环,不断相乘)

例如:cal(7) 计算7*6*5*4*3*2*1

def cal1(x):
if x > 0:
return x*cal1(x-1)

print(cal1(2))
报错
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'

为什么cal1(x-1)没有识别到类型?

编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码

写过,不写了,用2层函数返回内存地址,最里面执行原来函数和判断。知识:为什么要做2层返回?怎么把文件里的账号密码转出来进行判断?

 

1生成器和迭代器的区别?

生成器gennerater有2种生成方式1.列表生成式2.函数yield,一边循环一边计算的机制

迭代器iterator--可以被next()函数调用,

生成器有几种方式获取value?

1.列表生成式2.函数yield3.()

通过生成器写一个日志调用方法, 支持以下功能

根据指令向屏幕输出日志

根据指令向文件输出日志

根据指令同时向文件&屏幕输出日志

以上日志格式如下

2017-10-19 22:07:38 [1] test log db backup 3
2017-10-19 22:07:40 [2]    user alex login success 
#注意:其中[1],[2]是指自日志方法第几次调用,每调用一次输出一条日志

代码结构如下

 def logger(filename,channel='file'):
    """
    日志方法
    :param filename: log filename
    :param channel: 输出的目的地,屏幕(terminal),文件(file),屏幕+文件(both)
    :return:
    """
    ...your code...

 #调用
 log_obj = logger(filename="web.log",channel='both')
 log_obj.__next__()
 log_obj.send('user alex login success')
def log_obj():
print('log')
yield x

def log_obj2():
info = 'log'
f = open('file','a', encoding='UTF-8')
f.write('\n{}'.format(info))
f.close()

def log obj3()
def log obj():
def log_obj2()
log_obj1(x)
log_obj2(x)

最后一题不明白什么意思,同时输出的话,把函数写到里面执行不就可以了?

内置函数


用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb

name=['alex','wupeiqi','yuanhao','nezha']

name=['alex','wupeiqi','yuanhao','nezha']

name = map(lambda x:x+'_SB',name)

print(list(name))

用filter函数处理数字列表,将列表中所有的偶数筛选出来

num = [1,3,5,6,7,8]

num = [1,3,5,6,7,8]
def judge(n):
return n % 2 == 0
new_num = filter(judge,num)
print(list(new_num))

如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格

portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65} ]

计算购买每支股票的总价

用filter过滤出,单价大于100的股票有哪些

 def ss(n):
sum1 = n['price']
return sum1 > 100
newlis = filter(ss,p)
for i in newlis:
print(i['name'])
posted @ 2018-09-13 15:10  Freedom_L  阅读(285)  评论(0编辑  收藏  举报