文件处理相关
1.编码问题
a.请说明Python2与python3的默认编码是什么?
python2——ASCII
Python3——UTF-8
b.为什么会出现乱码?乱码的情况有几种?
软件运行终端解码(decode)方式与软件的编码(encode)方式不匹配。
如:软件运行时zh_cn.GBK的编码方式,而软件在编写的时候使用UTF-8的方式编码
c.如何进行编码转换?
字符串在python内部是采用Unicode,
其他编码先通过decode(‘字符串’,Unicode),然后再encode(‘字符串’,Utf-8)
d. #-*-coding:utf-8-*-的作用?
进行编码声明,写了这句,编码器就按这种方式进行解码。
e.解释py2 bytes vs py3 bytes的区别
这段还是需要再理解
2.文件处理
a.r和rb的区别?
r——读文件
rb——使用二进制方式读文件。
b.解析下面三个参数作用
open(f_name,'r',encoding="utf-8")
f_name:文件名 r: 读文件 encoding='utf-8':用utf-8的编码方式读
函数基础:
1.解析闭包的概念
一个封闭的包裹(闭),里面包含着自由变量(包)。
引用了自由变量的函数。这个被引用的自由变量和这个函数一同存在,
即使离开了创造它的环境也不例外。
#写函数,计算传入数字参数的和。(动态传参)
def func_sum(*args): re = 0 # 结果 for i in args: re = re + i return re res = func_sum(1, 2, 5, 7, 9) print(res)
# 写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。 str = 'ab bc' ls = ['', 1, 2, ''] tu = (1, 3, 3, 4) def func_num(args): for index in args: if index == '': print('含有空内容') else: print(index) func_num(ls)
#写函数,检查传入字典的每一个value的长度,如果大于2, #那么仅保留前两个长度的内容,并将新内容返回给调用者。 dic = {"k1": "v1v1", "k2": [11, 22, 33, 44]} #PS:字典中的value只能是字符串或列表 def func_dic(*args, **kwargs): new_dic = kwargs['dic'] for k in kwargs['dic']: if len(kwargs['dic'][k]) > 2: new_dic[k] = kwargs['dic'][k][0:2] # 符合要求的进行切片 return new_dic dic2 = func_dic(dic=dic) print(dic2)
#写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
# 例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)] def card(): number = [] for i in range(2, 11): # for 生成 2-10个数字 number.append(i) number.extend(['J', 'Q', 'K', 'A']) # 将 J、Q、K、A 加入 #print(number) flower = ['红心', '草花', '方块', '黑桃'] card_number = [] for i in number: # 遍历数字 for j in flower: # 遍历花 card_number.append((i, j)) # 加入列表 return card_number print(card())
# 写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值} def max_min(*args): max = args[0] # 1.先获得第0个元素 min = args[0] for i in args: #print(i) if i > max: # 2. 通过遍历把每个数进行匹配 max = i if i < min: min = i #print('max:', max) #print('min:', min) return {'max': max, 'min:': min} print(max_min(1, 2, 3, -4, 100))
#写函数,专门计算图形的面积 # 其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积 # 调用函数area(‘圆形’,圆半径) 返回圆的面积 # 调用函数area(‘正方形’,边长) 返回正方形的面积 # 调用函数area(‘长方形’,长,宽) 返回长方形的面积 import math def area(name, *args): def round(r): return ('圆的面积为:', math.pi * r * r) def square(x): # 正方形 return ('正方形的面积为:', x ** 2) def rectangle(x, y): # 长方形 return ('长方形的面积为:', x * y) if name == '圆形': return round(*args) if name == '正方形': return square(*args) if name == '长方形': return rectangle(*args) print(area('圆形', 3)) print(area('正方形', 3)) print(area('长方形', 3, 2))
#写函数,传入一个参数n,返回n的阶乘 def calcu(x): res = 1 for x in range(x, 0, -1): res = res * x return res res = calcu(7) print(res)
#编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件), # 要求登录成功一次,后续的函数都无需再输入用户名和密码 #1.先建立一个在文件目录下userinfo.txt文件贴上如下内容{"name":"abc","password":"123"} def login(func): def wrapper(*args, **kwargs): username = input("account:").strip() password = input("password:").strip() with open('userinfo.txt', 'r', encoding='utf-8') as f: userinfo = f.read().strip(',') # print(userinfo) userinfo = eval(userinfo) print(userinfo) if username in userinfo['name'] and password in userinfo['password']: print("success") else: print("pass") return wrapper @login def name(): print("hello") name()
生成器和迭代器
1.生成器和迭代器的区别?
(还需要理清)
生成器和迭代器 都是可以用for 循环来进行遍历的。
迭代器——可以通过for循环进行遍历,使用next()方法进行迭代,在迭代的末尾,会引发stopIteration异常。
生成器——生成器自身构成一个迭代器,每次迭代时使用yield返回值,下次调用时从上一次返回的值开始。
2.生成器有几种方式获取value?
两种:for循环获取 next获取
3.通过生生成器写一个日志调用方法。
后补
内置函数
#用map来处理字符串列表, 把列表中所有人都变成rich, 比方abc_rich name = ['abc', '123', 'haha', '你好'] def func(x): return x + '_rich' ls = map(func, name) print(list(ls))
#用filter函数处理数字列表,将列表中所有的偶数筛选出来 num = [1, 3, 5, 6, 7, 8] def filt_num(x): if x % 2 == 0: return x ls2 = filter(filt_num, num) print(list(ls2))
#如下,每个小字典的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} ] #第一种写法: def func_total(x): return {x['name']: x['shares']*x['price']} ls3 = map(func_total, portfolio) lis = list(ls3) print(lis[1]['AAPL']) #第二种写法: ls4 = map(lambda total: {total['name']: total['price']*total['shares']}, portfolio) print(list(ls4)) f = filter(lambda d: d['price'] >= 100, portfolio)
print(list(f))
请分别介绍文件操作中不同的打开方式之间的区别:
模式 | 含义 |
---|---|
r | 只读模式,打开时需要传入编码方式encoding='gbk' |
rb | 二进制只读模式,在未知文件编码方式或类型时可以用二进制只读来打开 |
r+ | 读写模式,表示可读写 |
rb+ | 读写模式,表示二进制可读写 |
w | 写模式需传编码方式 |
wb | 二进制写模式 |
w+ | 写模式 |
wb+ | 二进制写模式 |
a | 追加模式 |
ab | 二进制追加 |
a+ |
写读模式,可写可读 |
ab+ |
# #有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请将以字母“a”开头的元素的首字母改为大写字母; li = ['alex', 'egon', 'smith', 'pizza', 'alen'] # #第一种写法 def cap(x): for i in x: if i[0] == 'a': print(i.capitalize()) else: print(i) cap(li) #第二种写法 for i in range(len(li)): if li[i][0] == 'a': li[i] = li[i].capitalize() else: continue print(li)