安全矩阵

 找回密码
 立即注册
搜索
查看: 5173|回复: 0

python100例 下

[复制链接]

23

主题

58

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
发表于 2020-11-26 20:13:29 | 显示全部楼层 |阅读模式
怎么把程序打包成 exe 文件
用 Setuptools 里的 py2exe 库
安装py2app
pip3 install py2app


  • 怎么把程序打包成 Mac 系统可运行的 .app 文件
  • cd 到Demo.py文件所在的目录
  • py2applet --make-setup Demo.py完成显示生成setup.py

    怎么获取路径下所有目录名称?
    用 sys 下的 path 方法,返回的是目录名称的字符串列表
    1. >>> sys.path
    2. ['', '/Users/brucepk/Documents', '/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
    复制代码
    Python 环境下怎么执行操作系统命令?
    用 os 模块下的 system 方法
    1. >>> os.system('cd /Users/brucepk/Desktop && mkdir aaa.txt')
    2. 256
    复制代码
    怎么将当前时间转为字符串?
    用 time 模块里的 asctime 方法
    1. >>> import time
    2. >>> time.asctime()
    3. 'Sat Jul  4 17:36:00 2020'
    复制代码
    怎么将秒数转为时间数组
    用 time 模块里的 localtime 方法
    1. >>> import time
    2. >>> time.localtime(1888888888)
    3. time.struct_time(tm_year=2029, tm_mon=11, tm_mday=9, tm_hour=11, tm_min=21, tm_sec=28, tm_wday=4, tm_yday=313, tm_isdst=0)
    复制代码
    将时间元组转换为从新纪元后的秒数
    用 time 模块里的 mktime 方法
    1. >>> time.mktime((2020, 7, 3, 21, 48, 56, 4, 21, 0))
    2. 1593784136.0
    复制代码
    怎么将字符串转为时间元组
    用 time 模块里的 strptime 方法
    1. >>> import time
    2. >>> time.strptime('Sun Jul  5 08:29:51 2020')
    3. time.struct_time(tm_year=2020, tm_mon=7, tm_mday=5, tm_hour=8, tm_min=29, tm_sec=51, tm_wday=6, tm_yday=187, tm_isdst=-1)
    复制代码
    怎么随机打乱列表的顺序
    用 random 模块里的 shuffle 方法
    1. >>> import random
    2. >>> t = list(range(20))
    3. >>> t
    4. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    5. >>> random.shuffle(t)
    6. >>> t
    7. [16, 3, 13, 7, 6, 12, 17, 4, 15, 2, 5, 8, 18, 10, 9, 19, 14, 0, 1, 11]
    复制代码
    Python进阶习题怎么用for循环实现把字符串变成Unicode码位的列表
    1. >>> st = '!@#$%^&*'
    2. >>> codes = []
    3. >>> for s in st:
    4. codes.append(ord(s))

    5. >>> codes
    6. [33, 64, 35, 36, 37, 94, 38, 42]
    复制代码
    怎么用列表推导式实现把字符串变成Unicode码位的列表
    1. >>> st = '!@#$%^&*'
    2. >>> codes = [ord(s) for s in st]
    3. >>> codes
    4. [33, 64, 35, 36, 37, 94, 38, 42]
    复制代码
    很明显,用列表推导式实现比 for 循环加 append 更高效简洁,可读性更好。
    打印出两个列表的笛卡尔积
    解法1:使用生成器表达式产生笛卡尔积,可以帮忙省掉运行 for 循环的开销。
    1. >>> colors = ['blacks', 'white']
    2. >>> sizes = ['S', 'M', 'L']
    3. >>> for tshirt in ('%s %s'%(c, s) for c in colors for s in sizes):
    4.     print(tshirt)

    5. blacks S
    6. blacks M
    7. blacks L
    8. white S
    9. white M
    10. white L
    复制代码
    解法2:使用 itertools 里的 product 生成器函数。
  1. >>> import itertools
  2. >>> list(itertools.product(['blacks', 'white'], ['S', 'M', 'L']))
  3. [('blacks', 'S'), ('blacks', 'M'), ('blacks', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
复制代码
可迭代对象拆包时,怎么赋值给占位符
我们经常用 for 循环提取元组里的元素,对于我们不想接收的元素,我们可以用占位符 _ 接收。
  1. >>> player_infos = [('Kobe', '24'), ('James', '23'), ('Iverson', '3')]
  2. >>> for player_names, _ in player_infos:
  3.     print(player_names)

  4. Kobe
  5. James
  6. Iverson
复制代码
Python3 中,用什么方式接收不确定值或参数
用 *args 的方式,*args 位置可以在任意位置。
  1. >>> a, b, *c = range(8)
  2. >>> a, b, c
  3. (0, 1, [2, 3, 4, 5, 6, 7])
复制代码
  1. >>> a, *b, c, d = range(5)
  2. >>> a,b,c,d
  3. (0, [1, 2], 3, 4)
复制代码
  1. >>> *a, b, c, d = range(5)
  2. >>> a,b,c,d
  3. ([0, 1], 2, 3, 4)
复制代码
用切片将对象倒序
  1. >>> s = 'basketball'
  2. >>> s[::-1]
  3. 'llabteksab'
复制代码
怎么查看列表的 ID
  1. >>> l = [1, 2, 3]
  2. >>> id(l)
  3. 4507638664
复制代码
可变序列用*=(就地乘法)后,会创建新的序列吗?
不会,可变序列用*=(就地乘法)后,不会创建新的序列,新元素追加到老元素上,以列表为例,我们看下新老列表的id,相等的。
  1. >>> l = [1, 2, 3]
  2. >>> id(l)
  3. 4507939272
  4. >>> l *= 2
  5. >>> l
  6. [1, 2, 3, 1, 2, 3]
  7. >>> id(l)
  8. 4507939272
复制代码
可变序列用*=(就地乘法)后,会创建新的序列吗?
会,不可变序列用*=(就地乘法)后,会创建新的序列,以元组为例,我们看下新老元组的id,是不同的。
  1. >>> t = (1, 2, 3)
  2. >>> id(t)
  3. 4507902240
  4. >>> t *= 2
  5. >>> t
  6. (1, 2, 3, 1, 2, 3)
  7. >>> id(t)
  8. 4507632648
复制代码
所以,对不可变序列进行重复拼接操作的话,效率会很低,因为每次都有一个新对象,而解释器需要把原来对象中的元素先复制到新的对象里,然后再追加新的元素。
关于+=的一道谜题
  1. t = (1, 2, [30, 40])
  2. t[2] += [50, 60]
复制代码
到底会发生下面4种情况中的哪一种?
a. t变成(1, 2, [30, 40, 50, 60])。
b.因为tuple不支持对它的元素赋值,所以会抛出TypeError异常。
c.以上两个都不是。
d. a和b都是对的。
答案是d,请看下运行结果。
  1. >>> t = (1, 2, [30, 40])
  2. >>> t[2] += [50, 60]
  3. Traceback (most recent call last):
  4.   File "<pyshell#1>", line 1, in <module>
  5.     t[2] += [50, 60]
  6. TypeError: 'tuple' object does not support item assignment
  7. >>> t
  8. (1, 2, [30, 40, 50, 60])
复制代码
sort() 和 sorted() 区别
  1. l = [1, 9, 5, 8]
  2. j = l.sort()
  3. k = sorted(l)
复制代码
通过 Python Tutor 工具我们可以看到,sort() 会就地在原序列上排序,sorted() 新建了一个新的序列。
list.sort方法会就地排序列表,也就是说不会把原列表复制一份。这也是这个方法的返回值是None的原因,提醒你本方法不会新建一个列表。在这种情况下返回None其实是Python的一个惯例:如果一个函数或者方法对对象进行的是就地改动,那它就应该返回None,好让调用者知道传入的参数发生了变动,而且并未产生新的对象。
怎么通过 reverse 参数对序列进行降序排列
reverse 参数一般放在 sorted() 方法里面,reverse 默认值为 False,序列默认升序排列,降序排列的话需要将 reverse 值设置为 True。
  1. >>> l = [1, 9, 5, 8]
  2. >>> j = sorted(l, reverse=True)
  3. >>> j
  4. [9, 8, 5, 1]
复制代码
numpy 怎么把一维数组变成二维数组
  1. >>> a = numpy.arange(12)
  2. >>> a
  3. array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
  4. >>> a.shape = 3, 4
  5. >>> a
  6. array([[ 0,  1,  2,  3],
  7.        [ 4,  5,  6,  7],
  8.        [ 8,  9, 10, 11]])
复制代码
快速插入元素到列表头部
可以通过切片指定位置插入,头部就是[0:0]
  1. >>> l = [1, 2, 3, 4, 5]
  2. >>> l[0:0] = 'Python'
  3. >>> l
  4. ['P', 'y', 't', 'h', 'o', 'n', 1, 2, 3, 4, 5]
复制代码
还可以通过 insert() 方法插入,第一个参数是位置的坐标,从 0 开始。
  1. >>> l = [1, 2, 3, 4, 5]
  2. >>> l.insert(0, 'first')
  3. >>> l
  4. ['first', 1, 2, 3, 4, 5]
复制代码
在第一个元素之前添加一个元素之类的操作是很耗时的,因为这些操作会牵扯到移动列表里的所有元素。有没有更高效的方法?用双向队列 deque 类。
deque 类可以指定这个队列的大小,如果这个队列满员了,还可以从反向端删除过期的元素,然后在尾端添加新的元素。
  1. >>> from collections import deque
  2. >>> dp = deque(range(10), maxlen=15)
  3. >>> dp
  4. deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=15)
  5. >>> dp.appendleft(-1)
  6. >>> dp
  7. deque([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=15)
复制代码
字典的创建方法
Python中,你知道怎么创建字典吗?
  1. a = dict(one=1, two=2, three=3)
  2. b = {'one': 1, 'two': 2, 'three': 3}
  3. c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
  4. d = dict([('two', 2), ('one', 1), ('three', 3)])
  5. e = dict({'one': 1, 'two': 2, 'three': 3})

复制代码
用字典推导(dictcomp)构建字典
  1. dial_code = [
  2.     (86, 'China'),
  3.     (91, 'India'),
  4.     (1, 'US'),
  5.     (55, 'Brazil'),
  6.     (7, 'Russia'),
  7.     (81, 'Japan')
  8. ]

  9. coutry_code = {coutry:code for code, coutry in dial_code}
复制代码
通过一次查询给字典里不存的键赋予新值
用setdefault方法,只查询一次,效果更快
  1. coutry_code = {'China': 86, 'India': 91, 'US': 1, 'Brazil': 55, 'Russia': 7, 'Japan': 81}

  2. coutry_code.setdefault('china', []).append(86)
复制代码
如果用下面这种方法,需要查询三次
  1. if 'china' not in coutry_code:
  2.     coutry_code['china'] = []
  3.     coutry_code['china'].append(86)
  4. print(coutry_code)
复制代码
像k in my_dict.keys( )这种操作在Python 3中是很快的,而且即便映射类型对象很庞大也没关系。这是因为dict.keys( )的返回值是一个“视图”。视图就像一个集合,而且跟字典类似的是,在视图里查找一个元素的速度很快。在“Dictionary view objects”里可以找到关于这个细节的文档。Python 2的dict.keys( )返回的是个列表,因此虽然上面的方法仍然是正确的,它在处理体积大的对象的时候效率不会太高,因为k in my_list操作需要扫描整个列表。
怎么统计字符串中元素出现的个数?
用collections中的Counter方法统计,返回的结果是对应元素和个数形成的键值对。
  1. ct = collections.Counter('adcfadcfgbsdcv')
复制代码
结果:
  1. Counter({'d': 3, 'c': 3, 'a': 2, 'f': 2, 'g': 1, 'b': 1, 's': 1, 'v': 1})
复制代码
怎么统计出排名前n的元素?
用most_common方法,参数里填n,比如前两名的话
  1. ct.most_common(2)
复制代码
结果
  1. [('d', 3), ('c', 3)]
复制代码
列表去重
  1. >>> l = ['A', 'B', 'A', 'B']
  2. >>> list(set(l))
  3. ['A', 'B']
复制代码
求m中元素在n中出现的次数
基础解法:
  1. >>> m = {'A', 'B', 'C'}
  2. >>> n = {'B', 'C', 'D'}
  3. >>> found = 0
  4. >>> for i in m:
  5. if i in n:
  6.   found += 1
  7.   
  8. >>> found
  9. 2
复制代码
高级解法:
  1. >>> m = {'A', 'B', 'C'}
  2. >>> n = {'B', 'C', 'D'}
  3. >>> len(m & n)
  4. 2
复制代码
如果m和n不是集合的话,直接转换后再取交集
  1. >>> m = {'A', 'B', 'C'}
  2. >>> n = {'B', 'C', 'D'}
  3. >>> len(set(m) & srt(n))
  4. 2
复制代码
高级解法的另一种写法:
  1. >>> m = {'A', 'B', 'C'}
  2. >>> n = {'B', 'C', 'D'}
  3. >>> len(set(m).intersection(n))
  4. 2
复制代码
新建一个Latin-1字符集合,该集合里的每个字符的Unicode名字里都有“SIGN”这个单词,用集合推导式完成。
  1. >>> from unicodedata import name
  2. >>> {chr(i) for i in range(32, 256) if 'SIGN' in name(chr(i), '')}
  3. {'§', '%', '#', '+', '¬', '£', '<', '[b][font=STHeitiSC-Light][size=18px][b]查询系统默认编码方式[/b][/size][/font][/b][code]>>> fp = open('test.txt', 'w')
  4. >>> fp.encoding
  5. 'cp936'
复制代码
修改编码方式
  1. >>> fp = open('test.txt', 'w', encoding='utf-8')
  2. >>> fp.encoding
  3. 'utf-8'
复制代码
用递归实现阶乘
  1. def factorial(n):
  2.     """:return n!"""
  3.     return 1 if n < 2 else n * factorial(n-1)
复制代码
>>> all([])的输出结果是多少?
  1. True
复制代码
>>> any([])的输出结果是多少?
  1. False
复制代码
>>> any([])的输出结果是多少?
  1. False
复制代码
怎么判断对象是否可被调用?
用 Python 内置的函数 callable() 判断
  1. >>> [callable(obj) for obj in (abs, str, 2)]
  2. [True, True, False]
复制代码
怎么列出对象的所有属性
使用 dir 函数来获取对象的所有属性。
  1. >>> import requests
  2. >>> dir(requests)
  3. ['ConnectTimeout', 'ConnectionError', 'DependencyWarning', 'FileModeWarning', 'HTTPError', 'NullHandler', 'PreparedRequest', 'ReadTimeout', 'Request', 'RequestException', 'RequestsDependencyWarning', 'Response', 'Session', 'Timeout', 'TooManyRedirects', 'URLRequired', '__author__', '__author_email__', '__build__', '__builtins__', '__cached__', '__cake__', '__copyright__', '__description__', '__doc__', '__file__', '__license__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__title__', '__url__', '__version__', '_check_cryptography', '_internal_utils', 'adapters', 'api', 'auth', 'certs', 'chardet', 'check_compatibility', 'codes', 'compat', 'cookies', 'cryptography_version', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch', 'post', 'put', 'pyopenssl', 'request', 'session', 'sessions', 'status_codes', 'structures', 'urllib3', 'utils', 'warnings']
复制代码
怎么得到类的实例没有而函数有的属性列表
创建一个空的用户定义的类和空的函数,计算差集,然后排序。
  1. >>> class C:
  2.     pass

  3. >>> obj = C()
  4. >>> def func():
  5.     pass

  6. >>> sorted(set(dir(func)) - set(dir(obj)))
  7. ['__annotations__', '__call__', '__closure__', '__code__', '__defaults__', '__get__', '__globals__', '__kwdefaults__', '__name__', '__qualname__']
复制代码
函数中,不想支持数量不定的定位参数,但是想支持仅限关键字参数,参数怎么定义
那就要在关键字参数前加一个 *。
  1. >>> def f(a, *, b):
  2. return a, b

  3. >>> f(1, b=2)
  4. (1, 2)
复制代码
这样的话,b 参数强制必须传入实参,否则会报错。
怎么给函数参数和返回值注解
代码执行时,注解不会做任何处理,只是存储在函数的__annotations__属性(一个字典)中。
  1. def function(text: str, max_len: 'int > 0' = 80) -> str:
复制代码
函数声明中的各个参数可以在:之后增加注解表达式。如果参数有默认值,注解放在参数名和=号之间。如果想注解返回值,在)和函数声明末尾的:之间添加->和一个表达式。
Python对注解所做的唯一的事情是,把它们存储在函数的__annotations__属性里。仅此而已,Python不做检查、不做强制、不做验证,什么操作都不做。换句话说,注解对Python解释器没有任何意义。注解只是元数据,可以供IDE、框架和装饰器等工具使用
不使用递归,怎么高效写出阶乘表达式
通过 reduce 和 operator.mul 函数计算阶乘
  1. >>> from functools import reduce
  2. >>> from operator import mul
  3. >>> def fact(n):
  4.     return reduce(mul, range(1, n+1))

  5. >>> fact(5)
复制代码
Python什么时候执行装饰器?
函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。这突出了Python程序员所说的导入时和运行时之间的区别。
判断下面语句执行是否会报错?
  1. >>> b = 3
  2. >>> def fun(a):
  3.     print(a)
  4.     print(b)
  5.     b = 7

  6.    
  7. >>> fun(2)
复制代码
会报错,Python编译函数的定义体时,先做了一个判断,那就是 b 是局部变量,因为在函数中给它赋值了。但是执行 print(b) 时,往上又找不到 b 的局部值,所以会报错。
Python 设计如此,Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量。
  1. 2
  2. Traceback (most recent call last):
  3.   File "<pyshell#50>", line 1, in <module>
  4.     fun(2)
  5.   File "<pyshell#49>", line 3, in fun
  6.     print(b)
  7. UnboundLocalError: local variable 'b' referenced before assignment
复制代码
怎么强制把函数中局部变量变成全局变量
用 global 声明
  1. >>> b = 3
  2. >>> def fun(a):
  3.     global b
  4.     print(a)
  5.     print(b)
  6.     b = 7


  7. >>> b = 5
  8. >>> fun(2)
  9. 2
  10. 5
复制代码
闭包中,怎么对数字、字符串、元组等不可变元素更新
我们知道,在闭包中,声明的变量是局部变量,局部变量改变的话会报错。
  1. >>> def make_averager():
  2.     count = 0
  3.     total = 0
  4.     def averager (new_value):
  5.         count += 1
  6.         total += new_value
  7.         return total / count
  8.     return averager

  9. >>> avg = make_averager()
  10. >>> avg(10)
  11. Traceback (most recent call last):
  12.   File "<pyshell#63>", line 1, in <module>
  13.     avg(10)
  14.   File "<pyshell#61>", line 5, in averager
  15.     count += 1
  16. UnboundLocalError: local variable 'count' referenced before assignment
复制代码
为了解决这个问题,Python 3引入了 nonlocal 声明。它的作用是把变量标记为自由变量
  1. >>> def make_averager():
  2.     count = 0
  3.     total = 0
  4.     def averager (new_value):
  5.         nonlocal count, total
  6.         count += 1
  7.         total += new_value
  8.         return total / count
  9.     return averager

  10. >>> avg = make_averager()
  11. >>> avg(10)
  12. 10.0
复制代码
Python2 怎么解决访问外部变量报错的问题
https://www.python.org/dev/peps/pep-3104/
测试代码运行的时间
用 time 模块里的 perf_counter 方法。
  1. >>> t0 = time.perf_counter()
  2. >>> for i in range(10000):
  3.     pass

  4. >>> t1 = time.perf_counter()
  5. >>> t1-t0
复制代码
或者,直接用 time.time()
  1. >>> import time
  2. >>> t0 = time.time()
  3. >>> for i in range(10000):
  4.     pass

  5. >>> t1 = time.time()
  6. >>> t1-t0
复制代码


怎么优化递归算法,减少执行时间
使用装饰器 functools.lru_cache() 缓存数据
  1. >>> import functools
  2. >>> @functools.lru_cache()

  3. def fibonacci(n):
  4.     if n < 2:
  5.         return n
  6.     return fibonacci(n-2)+fibonacci(n-1)

  7. >>> fibonacci(6)
  8. 8
复制代码
标准库singledispatch官方文档:https://www.python.org/dev/peps/pep-0443/
比较两个对象的值(对象中保存的数据)是否相等
用 == 运算符比较
  1. >>> a = [1, 2, 3]
  2. >>> b = [1, 2, 3]
  3. >>> a==b
  4. True
复制代码
比较两个对象的内存地址 id 是否相等
用 is 比较,ID一定是唯一的数值标注,而且在对象的生命周期中绝不会变
  1. >>> a = [1, 2, 3]
  2. >>> b = [1, 2, 3]
  3. >>> a is b
  4. False
复制代码
怎么格式化显示对象?
可以用内置的 format( )函数和str.format( )方法。
format(my_obj, format_spec)的第二个参数,或者str.format( )方法的格式字符串,{}里代换字段中冒号后面的部分。
  1. >>> from datetime import datetime
  2. >>> now = datetime.now()
  3. >>> format(now, '%H:%M:%S')
  4. '08:18:21'
  5. >>> "It's now {:%I:%M%p}".format(now)
  6. "It's now 08:18AM"
复制代码
复制一个序列并去掉后 n 个元素
可能有同学会想到用 pop(),但这个方法会就地删除原序列,不会复制出一个新的序列。
可以用切片的思想,比如复制后去掉后两个元素。
  1. >>> l = [1, 2, 3, 4, 5]
  2. >>> j = l[:-2]
  3. >>> j
  4. [1, 2, 3]
复制代码
Python中怎么定义私有属性。
在属性前加两个前导下划线,尾部没有或最多有一个下划线
怎么随机打乱一个列表里元素的顺序
用 random 里的 shuffle 方法
  1. >>> from random import shuffle
  2. >>> l = list(range(30))
  3. >>> shuffle(l)
  4. >>> l
  5. [28, 15, 3, 25, 16, 18, 23, 10, 11, 21, 12, 7, 4, 0, 24, 6, 5, 22, 8, 13, 29, 9, 27, 17, 2, 20, 1, 26, 19, 14]
  6. >>>
复制代码
怎么判断某个对象或函数是一个已知的类型
用 Python 的内置函数 isinstance() 判读
  1. >>> isinstance('aa', str)
  2. True
复制代码
怎么打印出分数
用 fractions 中的 Fraction 方法
  1. >>> from fractions import Fraction
  2. >>> print(Fraction(1, 3))
  3. 1/3
复制代码
+ 和 += 区别
  • 两边必须是同类型的对象才能相加,+= 右操作数往往可以是任何可迭代对象。
    1. >>> l = list(range(6))
    2. >>> l += 'qwer'
    3. >>> l
    4. [0, 1, 2, 3, 4, 5, 'q', 'w', 'e', 'r']
    5. >>> j = l + (6, 7)
    6. Traceback (most recent call last):
    7.   File "<pyshell#91>", line 1, in <module>
    8.     j = l + (6, 7)
    9. TypeError: can only concatenate list (not "tuple") to list
    复制代码
    怎么列出一个目录下所有的文件名和子文件名
    用 os.walk 生成器函数,我用 site-packages 目录举例。
    1. >>> import os
    2. >>> dirs = os.walk('C:\Program Files\Python36\Lib\site-packages')
    3. >>> for dir in dirs:
    4. print(dir)


    5. ('C:\\Program Files\\Python36\\Lib\\site-packages', ['ad3', 'ad3-2.2.1.dist-info', 'adodbapi', 'aip', 'appium', 'AppiumLibrary', 'Appium_Python_Client-0.46-py3.6.egg-info', 'apscheduler', 'APScheduler-3.6.0.dist-info', 'atomicwrites', 'atomicwrites-1.3.0.dist-info', ...)
    复制代码
    怎么返回 1 到 10 的阶乘列表
    高效的方法需要用到 itertools 和 operator 模块,导包后一行代码搞定。
    1. >>> import itertools
    2. >>> import operator
    3. >>> list(itertools.accumulate(range(1, 11), operator.mul))
    4. [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
    复制代码
    怎么快速拼接字符串和序列形成新的列表
    用 itertools 里的 chain 方法可以一行代码搞定。
    1. >>> import itertools
    2. >>> list(itertools.chain('ABC', range(5)))
    3. ['A', 'B', 'C', 0, 1, 2, 3, 4]
    复制代码
    进度条显示
    用 tqdm 库
    1. >>> import time
    2. >>> from tqdm import tqdm
    3. >>> for i in tqdm(range(1000)):
    4.     time.sleep(.01)

    5.    

    6.   0%|          | 0/1000 [00:00<?, ?it/s]
    7.   1%|          | 9/1000 [00:00<00:11, 88.38it/s]
    8.   2%|1         | 15/1000 [00:00<00:13, 74.85it/s]
    9.   2%|1         | 19/1000 [00:00<00:17, 56.93it/s]
    10.   2%|2         | 25/1000 [00:00<00:17, 56.70it/s]
    11.   3%|3         | 30/1000 [00:00<00:19, 50.90it/s
    复制代码



, '=', 'µ', '®', '÷', '©', '±', '°', '¤', '¥', '¶', '×', '>', '¢'}[/code]查询系统默认编码方式
  1. &gt;&gt;&gt; fp = open('test.txt', 'w')
  2. &gt;&gt;&gt; fp.encoding
  3. 'cp936'
复制代码
修改编码方式
  1. &gt;&gt;&gt; fp = open('test.txt', 'w', encoding='utf-8')
  2. &gt;&gt;&gt; fp.encoding
  3. 'utf-8'
复制代码
用递归实现阶乘
  1. def factorial(n):
  2.     """:return n!"""
  3.     return 1 if n &lt; 2 else n * factorial(n-1)
复制代码
>>> all([])的输出结果是多少?
  1. True
复制代码
>>> any([])的输出结果是多少?
  1. False
复制代码
>>> any([])的输出结果是多少?
  1. False
复制代码
怎么判断对象是否可被调用?
用 Python 内置的函数 callable() 判断
  1. &gt;&gt;&gt; [callable(obj) for obj in (abs, str, 2)]
  2. [True, True, False]
复制代码
怎么列出对象的所有属性
使用 dir 函数来获取对象的所有属性。
  1. &gt;&gt;&gt; import requests
  2. &gt;&gt;&gt; dir(requests)
  3. ['ConnectTimeout', 'ConnectionError', 'DependencyWarning', 'FileModeWarning', 'HTTPError', 'NullHandler', 'PreparedRequest', 'ReadTimeout', 'Request', 'RequestException', 'RequestsDependencyWarning', 'Response', 'Session', 'Timeout', 'TooManyRedirects', 'URLRequired', '__author__', '__author_email__', '__build__', '__builtins__', '__cached__', '__cake__', '__copyright__', '__description__', '__doc__', '__file__', '__license__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__title__', '__url__', '__version__', '_check_cryptography', '_internal_utils', 'adapters', 'api', 'auth', 'certs', 'chardet', 'check_compatibility', 'codes', 'compat', 'cookies', 'cryptography_version', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch', 'post', 'put', 'pyopenssl', 'request', 'session', 'sessions', 'status_codes', 'structures', 'urllib3', 'utils', 'warnings']
复制代码
怎么得到类的实例没有而函数有的属性列表
创建一个空的用户定义的类和空的函数,计算差集,然后排序。
  1. &gt;&gt;&gt; class C:
  2.     pass

  3. &gt;&gt;&gt; obj = C()
  4. &gt;&gt;&gt; def func():
  5.     pass

  6. &gt;&gt;&gt; sorted(set(dir(func)) - set(dir(obj)))
  7. ['__annotations__', '__call__', '__closure__', '__code__', '__defaults__', '__get__', '__globals__', '__kwdefaults__', '__name__', '__qualname__']
复制代码
函数中,不想支持数量不定的定位参数,但是想支持仅限关键字参数,参数怎么定义
那就要在关键字参数前加一个 *。
  1. &gt;&gt;&gt; def f(a, *, b):
  2. return a, b

  3. &gt;&gt;&gt; f(1, b=2)
  4. (1, 2)
复制代码
这样的话,b 参数强制必须传入实参,否则会报错。
怎么给函数参数和返回值注解
代码执行时,注解不会做任何处理,只是存储在函数的__annotations__属性(一个字典)中。
  1. def function(text: str, max_len: 'int &gt; 0' = 80) -&gt; str:
复制代码
函数声明中的各个参数可以在:之后增加注解表达式。如果参数有默认值,注解放在参数名和=号之间。如果想注解返回值,在)和函数声明末尾的:之间添加->和一个表达式。
Python对注解所做的唯一的事情是,把它们存储在函数的__annotations__属性里。仅此而已,Python不做检查、不做强制、不做验证,什么操作都不做。换句话说,注解对Python解释器没有任何意义。注解只是元数据,可以供IDE、框架和装饰器等工具使用
不使用递归,怎么高效写出阶乘表达式
通过 reduce 和 operator.mul 函数计算阶乘
  1. &gt;&gt;&gt; from functools import reduce
  2. &gt;&gt;&gt; from operator import mul
  3. &gt;&gt;&gt; def fact(n):
  4.     return reduce(mul, range(1, n+1))

  5. &gt;&gt;&gt; fact(5)
复制代码
Python什么时候执行装饰器?
函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。这突出了Python程序员所说的导入时和运行时之间的区别。
判断下面语句执行是否会报错?
  1. &gt;&gt;&gt; b = 3
  2. &gt;&gt;&gt; def fun(a):
  3.     print(a)
  4.     print(b)
  5.     b = 7

  6.    
  7. &gt;&gt;&gt; fun(2)
复制代码
会报错,Python编译函数的定义体时,先做了一个判断,那就是 b 是局部变量,因为在函数中给它赋值了。但是执行 print(b) 时,往上又找不到 b 的局部值,所以会报错。
Python 设计如此,Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量。
  1. 2
  2. Traceback (most recent call last):
  3.   File "&lt;pyshell#50&gt;", line 1, in &lt;module&gt;
  4.     fun(2)
  5.   File "&lt;pyshell#49&gt;", line 3, in fun
  6.     print(b)
  7. UnboundLocalError: local variable 'b' referenced before assignment
复制代码
怎么强制把函数中局部变量变成全局变量
用 global 声明
  1. &gt;&gt;&gt; b = 3
  2. &gt;&gt;&gt; def fun(a):
  3.     global b
  4.     print(a)
  5.     print(b)
  6.     b = 7


  7. &gt;&gt;&gt; b = 5
  8. &gt;&gt;&gt; fun(2)
  9. 2
  10. 5
复制代码
闭包中,怎么对数字、字符串、元组等不可变元素更新
我们知道,在闭包中,声明的变量是局部变量,局部变量改变的话会报错。
  1. &gt;&gt;&gt; def make_averager():
  2.     count = 0
  3.     total = 0
  4.     def averager (new_value):
  5.         count += 1
  6.         total += new_value
  7.         return total / count
  8.     return averager

  9. &gt;&gt;&gt; avg = make_averager()
  10. &gt;&gt;&gt; avg(10)
  11. Traceback (most recent call last):
  12.   File "&lt;pyshell#63&gt;", line 1, in &lt;module&gt;
  13.     avg(10)
  14.   File "&lt;pyshell#61&gt;", line 5, in averager
  15.     count += 1
  16. UnboundLocalError: local variable 'count' referenced before assignment
复制代码
为了解决这个问题,Python 3引入了 nonlocal 声明。它的作用是把变量标记为自由变量
  1. &gt;&gt;&gt; def make_averager():
  2.     count = 0
  3.     total = 0
  4.     def averager (new_value):
  5.         nonlocal count, total
  6.         count += 1
  7.         total += new_value
  8.         return total / count
  9.     return averager

  10. &gt;&gt;&gt; avg = make_averager()
  11. &gt;&gt;&gt; avg(10)
  12. 10.0
复制代码
Python2 怎么解决访问外部变量报错的问题
https://www.python.org/dev/peps/pep-3104/
测试代码运行的时间
用 time 模块里的 perf_counter 方法。
  1. &gt;&gt;&gt; t0 = time.perf_counter()
  2. &gt;&gt;&gt; for i in range(10000):
  3.     pass

  4. &gt;&gt;&gt; t1 = time.perf_counter()
  5. &gt;&gt;&gt; t1-t0
复制代码
或者,直接用 time.time()
  1. &gt;&gt;&gt; import time
  2. &gt;&gt;&gt; t0 = time.time()
  3. &gt;&gt;&gt; for i in range(10000):
  4.     pass

  5. &gt;&gt;&gt; t1 = time.time()
  6. &gt;&gt;&gt; t1-t0
复制代码


怎么优化递归算法,减少执行时间
使用装饰器 functools.lru_cache() 缓存数据
  1. &gt;&gt;&gt; import functools
  2. &gt;&gt;&gt; @functools.lru_cache()

  3. def fibonacci(n):
  4.     if n &lt; 2:
  5.         return n
  6.     return fibonacci(n-2)+fibonacci(n-1)

  7. &gt;&gt;&gt; fibonacci(6)
  8. 8
复制代码
标准库singledispatch官方文档:https://www.python.org/dev/peps/pep-0443/
比较两个对象的值(对象中保存的数据)是否相等
用 == 运算符比较
  1. &gt;&gt;&gt; a = [1, 2, 3]
  2. &gt;&gt;&gt; b = [1, 2, 3]
  3. &gt;&gt;&gt; a==b
  4. True
复制代码
比较两个对象的内存地址 id 是否相等
用 is 比较,ID一定是唯一的数值标注,而且在对象的生命周期中绝不会变
  1. &gt;&gt;&gt; a = [1, 2, 3]
  2. &gt;&gt;&gt; b = [1, 2, 3]
  3. &gt;&gt;&gt; a is b
  4. False
复制代码
怎么格式化显示对象?
可以用内置的 format( )函数和str.format( )方法。
format(my_obj, format_spec)的第二个参数,或者str.format( )方法的格式字符串,{}里代换字段中冒号后面的部分。
  1. &gt;&gt;&gt; from datetime import datetime
  2. &gt;&gt;&gt; now = datetime.now()
  3. &gt;&gt;&gt; format(now, '%H:%M:%S')
  4. '08:18:21'
  5. &gt;&gt;&gt; "It's now {:%I:%M%p}".format(now)
  6. "It's now 08:18AM"
复制代码
复制一个序列并去掉后 n 个元素
可能有同学会想到用 pop(),但这个方法会就地删除原序列,不会复制出一个新的序列。
可以用切片的思想,比如复制后去掉后两个元素。
  1. &gt;&gt;&gt; l = [1, 2, 3, 4, 5]
  2. &gt;&gt;&gt; j = l[:-2]
  3. &gt;&gt;&gt; j
  4. [1, 2, 3]
复制代码
Python中怎么定义私有属性。
在属性前加两个前导下划线,尾部没有或最多有一个下划线
怎么随机打乱一个列表里元素的顺序
用 random 里的 shuffle 方法
  1. &gt;&gt;&gt; from random import shuffle
  2. &gt;&gt;&gt; l = list(range(30))
  3. &gt;&gt;&gt; shuffle(l)
  4. &gt;&gt;&gt; l
  5. [28, 15, 3, 25, 16, 18, 23, 10, 11, 21, 12, 7, 4, 0, 24, 6, 5, 22, 8, 13, 29, 9, 27, 17, 2, 20, 1, 26, 19, 14]
  6. &gt;&gt;&gt;
复制代码
怎么判断某个对象或函数是一个已知的类型
用 Python 的内置函数 isinstance() 判读
  1. &gt;&gt;&gt; isinstance('aa', str)
  2. True
复制代码
怎么打印出分数
用 fractions 中的 Fraction 方法
  1. &gt;&gt;&gt; from fractions import Fraction
  2. &gt;&gt;&gt; print(Fraction(1, 3))
  3. 1/3
复制代码
+ 和 += 区别
  • 两边必须是同类型的对象才能相加,+= 右操作数往往可以是任何可迭代对象。
    1. &gt;&gt;&gt; l = list(range(6))
    2. &gt;&gt;&gt; l += 'qwer'
    3. &gt;&gt;&gt; l
    4. [0, 1, 2, 3, 4, 5, 'q', 'w', 'e', 'r']
    5. &gt;&gt;&gt; j = l + (6, 7)
    6. Traceback (most recent call last):
    7.   File "&lt;pyshell#91&gt;", line 1, in &lt;module&gt;
    8.     j = l + (6, 7)
    9. TypeError: can only concatenate list (not "tuple") to list
    复制代码
    怎么列出一个目录下所有的文件名和子文件名
    用 os.walk 生成器函数,我用 site-packages 目录举例。
    1. &gt;&gt;&gt; import os
    2. &gt;&gt;&gt; dirs = os.walk('C:\Program Files\Python36\Lib\site-packages')
    3. &gt;&gt;&gt; for dir in dirs:
    4. print(dir)


    5. ('C:\\Program Files\\Python36\\Lib\\site-packages', ['ad3', 'ad3-2.2.1.dist-info', 'adodbapi', 'aip', 'appium', 'AppiumLibrary', 'Appium_Python_Client-0.46-py3.6.egg-info', 'apscheduler', 'APScheduler-3.6.0.dist-info', 'atomicwrites', 'atomicwrites-1.3.0.dist-info', ...)
    复制代码
    怎么返回 1 到 10 的阶乘列表
    高效的方法需要用到 itertools 和 operator 模块,导包后一行代码搞定。
    1. &gt;&gt;&gt; import itertools
    2. &gt;&gt;&gt; import operator
    3. &gt;&gt;&gt; list(itertools.accumulate(range(1, 11), operator.mul))
    4. [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
    复制代码
    怎么快速拼接字符串和序列形成新的列表
    用 itertools 里的 chain 方法可以一行代码搞定。
    1. &gt;&gt;&gt; import itertools
    2. &gt;&gt;&gt; list(itertools.chain('ABC', range(5)))
    3. ['A', 'B', 'C', 0, 1, 2, 3, 4]
    复制代码
    进度条显示
    用 tqdm 库
    1. &gt;&gt;&gt; import time
    2. &gt;&gt;&gt; from tqdm import tqdm
    3. &gt;&gt;&gt; for i in tqdm(range(1000)):
    4.     time.sleep(.01)

    5.    

    6.   0%|          | 0/1000 [00:00&lt;?, ?it/s]
    7.   1%|          | 9/1000 [00:00&lt;00:11, 88.38it/s]
    8.   2%|1         | 15/1000 [00:00&lt;00:13, 74.85it/s]
    9.   2%|1         | 19/1000 [00:00&lt;00:17, 56.93it/s]
    10.   2%|2         | 25/1000 [00:00&lt;00:17, 56.70it/s]
    11.   3%|3         | 30/1000 [00:00&lt;00:19, 50.90it/s
    复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-28 20:48 , Processed in 0.021323 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表