python学习笔记(八)

54URL中文编解码

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

56Sorted的高级用法

题目:一个字符串仅包含大小写字母,现在要将其排序成一个新的字符串,次序为从az,且相同的大写和小写字母排在一起,大写在小写前。
如原字符串为'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、evalexec的用法

相同点:都是将字符串转换成python代码执行。

evalevaluate的简写,参数只能是表达式,返回值为表达式的结果,而且只能为一条语句。

a = eval("5+4")   # a = 9

exec是execute的缩写,能将字符串转换成python代码执行,没有返回值,参数可以为多行代码块。

exec("print('Hello world!')")

如果要执行python文件中的代码:

with open("test.py") as f:
        exec(f.read())

59、Python2python3的编码问题

字符串的编码等于当前文件的默认编码。

python2中,字符串需要先解码,解码之后的类型为unicode,之后再通过编码,编为其他格式的字符串。

python3中,unicode类型也是str,字符串需要先解码,解码之后的类型为unicode,之后再编码成其他格式的字符串。

60、关于出现乱码的问题

在文件中,所有文字的默认编码为文件的编码,比如py文件设置编码为UTF-8,变量 a = ‘我们’,如果直接print(a),则默认解码为UTF8,显示正常;如果print(a.encode(‘utf-8’).decode(‘GBK’)),则显示乱码(相当于在UTF-8的控制台上显示GBK编码的字符).

posted @ 2018-11-14 09:46  雅虎跳跳  阅读(184)  评论(0编辑  收藏  举报