python常用语法3
Python语法帮助文档
Python Cookbook 3rd Edition Documentation
1. 生成随机数
import random
var = random.randint(0, 9)
print("%s ==> %d" % (type(var), var)) # <class 'int'> ==> 4
参考:Python 随机数生成
1.1 产生一个上下界之间的随机浮点数
random.uniform(0.1, 0.4)
2. Decimal类型导入方式和创建对象方式
decimal是数据库和python的十进制浮点类型
from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
参考: https://docs.python.org/zh-cn/3/library/decimal.html
DateAndDecimalEncoder
只有默认序列化器无法序列化时才会采用这个自定义的序列化器
参考: json--- JSON 编码和解码器、JSON编码/自定义对象的解码
3. python计算MD5值
import hashlib
deomo_val = 'Follow me,like and comment anything on this video..just say hi🤷\u200d♂️ And your in the running #rctiktok #$25giftcardgiveaway2021 #giftcards#rccars'
md5_val = hashlib.md5(deomo_val.encode('utf8')).hexdigest()
print ('src_val : %s \nmd5_val : %s' % (deomo_val,md5_val))
参考: 利用 Python 计算MD5值
如果不想写代码,也可以借助这个在线网站直接生成md5码:https://www.bejson.com/enc/md5/
4. python格式化输出的三种形式
5. 生成随机字符串算法
小写字母+大写字母+数字组成的字符集,然后每次生成一个随机数作为字符集的下标,获取这个下标对应的字符,循环n次,即可获得一个长度为n的随机字符串
import random
def get_random_str():
str_set="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
rand_str = ''
for i in range(0, 31): # 通过这里控制字符串的长度
number=random.randint(0, 61)
rand_str += str_set[number]
return rand_str
if __name__ == "__main__":
print(get_random_str())#0FwDEGUb9Hc8XUbsYHxKVJZd3Az6piO
参考: 生成随机字符串(三种方式)
6.如何在Mac上安装build-essential?
mac使用的工具包是homebrew, 不需要这个build-essential包,只有debian操作系统需要。
mac需要的与之对应的包是xcode-select,在控制台输入xcode-select, 如果有帮助信息打出出来,说明已经安装好了,否则使用下面的命令安装即可。
xcode-select install
7.Ubuntu和Debian操作系统安装build-essential
apt-get install build-essential
# 或者加上sudo权限
sudo apt-get install build-essential
apt-get命令使用可以参考:Ubuntu : apt-get 命令
8. python的私有变量和方法
(1)_xxx " 单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问; 不能用'from module import *'导入
(2)__xxx "双下划线”开始的方法和变量是类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。),
" 双下划线 " 开始的是私有成员,意思是 只有类对象自己能访问,连子类对象也不能访问到这个数据。
(3)xxx 系统定义名字, 前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 init()代表类的构造函数。
9. 子类调用父类的方法
使用 super()
函数,使用方式是super().父类方法名,比如
class A:
def __init__(self):
self.x = 0
def spam(self):
print('A.spam')
class B(A):
def __init__(self):
super().__init__()
self.y = 1
def spam(self):
print('B.spam')
super().spam() # Call parent spam()
参考:8.7 调用父类方法
10. python存在方法重载
重载是,函数或者方法有相同的名称,但是参数列表不相同(类型不同,数量不同,位置不同)的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
python的实现过程中可能存在重载,但是在Python的呈现使用中不存在重载的概念。
原因:python 可以接受任何类型的参数,而对那些缺少的参数设定为缺省参数即可解决问题。即,python中参数传递时候的*arg和**kwargs
11. python的生产者消费者模式
python利用线程安全的阻塞队列Queue来实现生产者消费者模式
参考: python 队列(queue)阻塞、Python Queue队列实现线程通信、用Python多线程实现生产者消费者模式、Python的condition和阻塞队列Queue
13. ImportError: No module named 'google'
pip install --upgrade google-api-python-client
pip install protobuf
pip install google-cloud-translate
参考:ImportError: No module named 'google'
14. 12.9 Python的全局锁问题
问题
你已经听说过全局解释器锁GIL,担心它会影响到多线程程序的执行性能。多线程在网络请求或者读写请求的时间越长,优势越显著。密集型计算中则优势不明显。
解决方案
尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。 实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。 GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。
在讨论普通的GIL之前,有一点要强调的是GIL只会影响到那些严重依赖CPU的程序(比如计算型的)。 如果你的程序大部分只会涉及到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。实际上,你完全可以放心的创建几千个Python线程, 现代操作系统运行这么多线程没有任何压力,没啥可担心的。
而对于依赖CPU的程序,你需要弄清楚执行的计算的特点。 例如,优化底层算法要比使用多线程运行快得多。 类似的,由于Python是解释执行的,如果你将那些性能瓶颈代码移到一个C语言扩展模块中, 速度也会提升的很快。如果你要操作数组,那么使用NumPy这样的扩展会非常的高效。 最后,你还可以考虑下其他可选实现方案,比如PyPy,它通过一个JIT编译器来优化执行效率 (不过在写这本书的时候它还不能支持Python 3)。
14 Python split()方法
split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串。返回分割后的字符串列表。
split() 方法语法:
str.split(str="", num=string.count(str)).
参数
- str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
- num -- 分割次数。默认为 -1, 即分隔所有。
15. pytest的全局日志配置
pytest的所有日志文件选项在配置 Pytest.ini 文件中设置:
- log_file
- log_file_level
- log_file_format
- log_file_date_format
log_cli = 1 # 默认关闭,将log_cli配置设置为true,pytest 将输出日志记录到控制台。
log_cli_level = DEBUG
log_cli_date_format = %Y-%m-%d-%H-%M-%S
log_cli_format = %(asctime)s - %(filename)s - %(module)s - %(funcName)s - %(lineno)d - %(levelname)s - %(message)s
log_file = test.log
参考: Pytest系列(9)-日志配置
17. python判断两个字符串是否相等
== 用来判断两个对象的值是否相等(跟 Java 不同,Java 中 == 用来判断是否是同一个对象)。
18. Python 反转字符串
给定一个字符串,然后将其翻转,逆序输出。
实例 1:使用字符串切片
str='Runoob'
print(str[::-1]) #boonuR
实例 2:使用 reversed()
str='Runoob'
print(''.join(reversed(str))) #boonuR
参考:Python 字符串翻转
19. Python 输出详细的异常信息(traceback)方式
print(traceback.format_exc())
import traceback
try:
num = 1 / 0
except Exception as e:
print(e.args)
print("===============")
print(traceback.format_exc())
参考:Python 输出详细的异常信息(traceback)方式
20. Pylint
官网:pylint 2.9.5
安装方式是:pip install pylint
这是一个语法静态检查的工具包,但是我装上了这个工具包之后,有些import语句会提示"Unable to import 'xxx'pylint(import-error)"
在VS code中使用command + shift + p, 搜索settings.json文件后,添加下面的配置还是没有用
{
"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"
}
参考:
21. json.loads()不仅能将字符串转换成字典,还能转换成列表list
json.loads()不仅能将字符串转换成字典,还能将字符串转换成列表list
import json
list_str = "[123,456]"
list1 = json.loads(list_str)
print(type(list1), "======>", list1) # <class 'list'> ======> [123, 456]
str = json.dumps(list1)
print(type(str), "========>", str) # <class 'str'> ========> [123, 456]
22. 同一个文件中,某些方法可以导入进来,某些导入不了,
可能是你有两个名字一样的文件,然后你修改的和导入的不是同一个
23. json.dump()和json.dumps()
dumps是将dict转化成str格式,loads是将str转化成dict格式。
dump和load也是类似的功能,只是与文件操作结合起来了。
参考:Python的json.dumps() json.dump()的区别
24. python的三目运算符
exp1 if condition else exp2
25. Pytest 去除过时警告
venv/lib/python3.9/site-packages/thriftpy2/contrib/aio/server.py:49
DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
def make_client(service, host='localhost', port=9090, unix_socket=None,
-- Docs: https://docs.pytest.org/en/stable/warnings.html
添加如下配置即可不显示上述警告,参考https://docs.pytest.org/en/stable/warnings.html
# pytest.ini
[pytest]
filterwarnings =
error
ignore::UserWarning
ignore:function ham() is deprecated:DeprecationWarning
26. ImportError: attempted relative import with no known parent package
在当前文件夹和各级文件夹下都创建__init__.py文件
参考:Python项目文件引用问题:ImportError: attempted relative import with no known parent package
27. python 二维列表按列取元素
>>> b = [i[0] for i in a] # 从a中的每一行取第一个元素。
>>> print(b)
[1, 4]
28. 使用 pytest 运行自动化 case
$ pytest min_max_test.py::test_min