函数基础:
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): # 在d里i是每行信息字符串的列表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'])