54、URL中文编解码
URL地址里面有中文时,会做编码,如果想解码成中文,需要用:
From urllib import parse
CN_str = Parse.unquote(str)
55、含有生成器的递归函数
因为函数中含有yield时,就是生成器函数,因此在函数内调用自己时,就不能用普通的函数调用方式。本质上是一个生成器,因此要用生成器的调用方式。
对一个数分解质因数。红色部分就是函数调用自己,要遍历生成器中的所有元素,并返回。
def resolution_factors(n):
for i in range(2, int(math.sqrt(n)+1)):
if n % i == 0:
yield i
n = int(n/i)
if n == 3:
yield n
else:
for j in resolution_factors(n):
yield j
break
elif i == int(math.sqrt(n)):
yield int(n)
def resolution_factors(n)::
for i in range(2, n + 1):
if(n % i == 0 ):
yield i
n = int(n/i)
for j in resolution_factors(n):
yield j
break
56、Sorted的高级用法
题目:一个字符串仅包含大小写字母,现在要将其排序成一个新的字符串,次序为从a到z,且相同的大写和小写字母排在一起,大写在小写前。
如原字符串为'easqWAwaeq',排序后为'AaaeeqqsWw'
a = 'easqWAwaeq'
print(''.join(sorted(a, key=lambda x:ord(x.upper())*2 +x.islower())))
print(''.join(sorted(a, key=lambda x:ord(x.upper())*2 if x.isupper() else ord(x.upper())*2+1)))
(1)sorted能用来重新排序的是任何可迭代对象,字符串也是可迭代对象,因此可以不用转换成list就能作为入参
(2)Sorted的参数key等于的是一个函数,如果另外定义的函数,写法是key=fun,等于函数名称,不带括号。函数的入参是a的每一个元素。a中的每一个元素通过函数处理后的结果来排序。
(3)Sorted返回的是一个列表,''.join(b),b可以是一个字符串,也可以是一个只含字符串的列表。将list转换成string。
57、Sorted对多列排序
l = [(1,2,3,4),(1,3,4,2),(1,2,4,3),(2,1,3,4),(2,4,3,1),(3,4,2,1),(3,2,1,4)]
对列表l,先按每个元组的第一个元素升序排列,再按第3个元素升序排列
Sorted(l, key=lambda x: (x[0], x[2]))
缺点是,只能要么都按升序,要么都按降序排列。不能一个升序,一个降序。
58、eval和exec的用法
相同点:都是将字符串转换成python代码执行。
eval是evaluate的简写,参数只能是表达式,返回值为表达式的结果,而且只能为一条语句。
a = eval("5+4") # a = 9
exec是execute的缩写,能将字符串转换成python代码执行,没有返回值,参数可以为多行代码块。
exec("print('Hello world!')")
如果要执行python文件中的代码:
with open("test.py") as f:
exec(f.read())
59、Python2和python3的编码问题
字符串的编码等于当前文件的默认编码。
在python2中,字符串需要先解码,解码之后的类型为unicode,之后再通过编码,编为其他格式的字符串。
在python3中,unicode类型也是str,字符串需要先解码,解码之后的类型为unicode,之后再编码成其他格式的字符串。
60、关于出现乱码的问题
在文件中,所有文字的默认编码为文件的编码,比如py文件设置编码为UTF-8,变量 a = ‘我们’,如果直接print(a),则默认解码为UTF8,显示正常;如果print(a.encode(‘utf-8’).decode(‘GBK’)),则显示乱码(相当于在UTF-8的控制台上显示GBK编码的字符).