参考:
推荐阅读
最近一次更新时间: 2020-9-5,更多连载请查看【python】,
文章目录
1、初步接触导入模块(math for example)
以 math
库为例,
- ceil:向下取整
- floor:向上取整
- sqrt:开方
- exp: e x e^x ex
- e:自然常数 e
- log:log 以 e 底
- pi: π \pi π
- factorial:阶乘
- gcd:最小公约数
阶乘
import math
n = 6
print(math.factorial(n))
output
720
最大公约数 / 最小公倍数
import math
a = 15
b = 50
x = math.gcd(a,b) # 求最小公约数
y = a*b//x # 根据最小公约数求最大公倍数
print(x, y)
output
5 150
- import math(导入模块 math.xxx / math.yyy )
- import math as m (对模块名进行缩写 m.xxx / m.yyy )
- from math import xxx,yyy(导入模块你所需要的功能 xxx / yyy)
- from math import *(导入模块的所有功能 xxx / yyy)
2、输入输出(input、print)
2.1、输入(input)
在框中输入kobe,并看一下输入的结果
input 默认是str类型
确保相等可以加一个int()强制把str转换为int类型
2.2、输出(print)
先看一个比较有意思的例子
n = 5
print('\n'.join('😀' * i for i in range(1, n + 1)))
output
😀
😀😀
😀😀😀
😀😀😀😀
😀😀😀😀😀
下面看看使用 print 语句写入文件
print("Hello, World!", file=open('file.txt', 'w'))
使用的时候,可以配合打印提示,比如
print("prepare to write...")
print("Hello, World!", file=open('file.txt', 'w'))
下面再看看 print 结合属性的一些灵活应用
print("Hello", end="")
print("World") # HelloWorld
print("Hello", end=" ")
print("World") # Hello World
print('words', 'with', 'commas', 'in', 'between', sep=', ') # words, with, commas, in, between
print("29", "10", "2021", sep="/") # 29/10/2021
print("name", "domain.com", sep="@") # name@domain.com
使用下划线分割过于长的数字
print(1_000_000_000) # 1000000000
print(1_234_567) # 1234567
2.2.1、%
sep表示分解符
print() 函数还可以用字符串格式化控制输出的形式,常见的格式字符如下表:
print('%o' % 20)
print('%d' % 20)
print('%x' % 20)
output
24
20
14
我们用 %s 代替要输出的内容,而后一个 %后面 你的内容则是真正输出的内容,如果有多个 %s,在最后的 % 后面要 加括号 将真正输出内容括起来。
Note:%f,%e 默认精确到小数点后6位
Note:
1)原数字宽度不够m的时候,自动左边补空格
2)#的用法为,%#0 或者%#x
%m.nf m指的是输出总宽度,小数点之后保留n位(四舍五入保存),如果总宽度超过m,按照实际显示
2.2.2、format
str.format()通过{ }来代替%,功能更强!
1){}内为关键字参数
2){}内也可由位置参数,0,1,2……表示,.format()直接写,不用,0=XXX,1=XXX
3)也可以两种方法混用,但是位置参数需要在关键字参数之前
下面是一个比较灵活的例子
'{0}{1:.2f}'.format('Pi = ', 3.1415)#:.2f限制输出的位数
结果为
'Pi = 3.14'
2.2.3、f-string
和 format 比较类似,还是比较方便的
Hello = "Hello"
World = "World"
print(f"{Hello} {World}") # 避免 + " " +
output
Hello World
2.2.4、pprint
打印比 print 更加美观
参考
一文读懂Python中print和pprint的区别
Python3内置模块pprint让打印比print更美观详解
使用
from pprint import pprint
response = [
{"status": 200, "result":[1,2,3,4,5]},
{"status": "OK", "result":["hello", "world"]},
{"status": 404, "result": "Data not found"}
]
print(response,"\n")
pprint(response)
output
[{'status': 200, 'result': [1, 2, 3, 4, 5]}, {'status': 'OK', 'result': ['hello', 'world']}, {'status': 404, 'result': 'Data not found'}]
[{'result': [1, 2, 3, 4, 5], 'status': 200},
{'result': ['hello', 'world'], 'status': 'OK'},
{'result': 'Data not found', 'status': 404}]
2.2.5、下划线
使用下划线分割数值较大的数字
print(1_000_000_000)
output
1000000000
2.2.6、打印内容写到文件中
使用print语句写入到文件里
print("Hello, World!", file=open('source.txt', 'w'))
2.3、colorama 库,控制输出的字体样式
from colorama import Fore, Back, Style
print(Fore.YELLOW + "some yellow text")
print(Back.RED + "and with a red background")
print(Style.DIM + "and in dim text") # 变淡
print(Style.RESET_ALL)
print("back to normal now")
dim 看的不是特别明显
3、time 模块
统计代码执行时间
import time
start_time = time.time()
result = 0
for i in range(10**3):
for j in range(10**3):
result += i*j
print(result)
end_time = time.time()
total_time = end_time - start_time
print("time:",total_time)
output
249500250000
time: 0.09956932067871094
显示当前时间
import time
print(time.ctime())
output
Thu Aug 13 20:00:00 2021
4、future 模块
from __future__ import
引用未来 python 版本的功能,例如 python 2 可以使用 python3 的内容
1)print_function
from __future__ import print_function
可在 python2 的环境下(print
),超前使用 python3 的 print 函数(也即 print()
)
2)absolute_import
引用绝对路径而不是相对路径
from __future__ import absolute_import
3)division
from __future__ import division
python 2 的除法是整除( //
),python 3 除法是 /
,整除是 //
5、argparse 模块
python 内置的模块
ArgumentParser
对象和 add_argument()
方法 使用方法如下
import argparse
parser = argparse.ArgumentParser(description='Train keypoints network')
parser.add_argument('--cfg',
help='experiment configure file name',
required=True,
type=str)
args = parser.parse_args()
print(args)
required=True
了,在 terminal 中调用的时候,必须加上此项,eg python demo.py --cfg "hello"
结果为
Namespace(cfg='hello')
6、sys
可以利用 sys.getsizeof
查看数据所占内存的大小
import sys
print(sys.getsizeof(1))
print(sys.getsizeof(1.0))
print(sys.getsizeof("1"))
print(sys.getsizeof("1.0"))
print(sys.getsizeof([]))
print(sys.getsizeof({}))
print(sys.getsizeof(set()))
output
28
24
50
52
56
64
216
7、enum
枚举类型,先简单的感受一下
from enum import Enum
Season = Enum('Season', "spring summer autumn winter")
print(type(Season))
print(type(Season.spring))
print(type(Season.spring.name))
print(Season.spring.name)
print(type(Season.spring.value))
print(Season.spring.value)
print(Season._member_names_)
output
<class 'enum.EnumMeta'>
<enum 'Season'>
<class 'str'>
spring
<class 'int'>
1
['spring', 'summer', 'autumn', 'winter']
可以以字典的方式赋值枚举变量
from enum import Enum
Season = Enum('Season', {"spring":'windy',"summer":'hot'})
print(Season.spring.value)
output
windy
下面看看更 DIY 的方式
from enum import Enum
class Season(Enum):
spring = 'windy'
summer = 'hot'
autumn = 'cool'
winter = 'cold'
print(Season._member_names_) # 全部枚举变量列表
print("\n")
print(Season._value2member_map_) # 字典键是枚举值,值是枚举变量
print("\n")
print(Season.__members__.items()) # 全部的枚举值
print("\n")
for v in Season:
print(v.name, v.value)
output
['spring', 'summer', 'autumn', 'winter']
{'windy': <Season.spring: 'windy'>, 'hot': <Season.summer: 'hot'>, 'cool': <Season.autumn: 'cool'>, 'cold': <Season.winter: 'cold'>}
dict_items([('spring', <Season.spring: 'windy'>), ('summer', <Season.summer: 'hot'>), ('autumn', <Season.autumn: 'cool'>), ('winter', <Season.winter: 'cold'>)])
spring windy
summer hot
autumn cool
winter cold
8、tqdm
tqdm 就能非常完美的支持和解决这些问题,可以实时输出处理进度而且占用的 CPU 资源非常少,支持 windows、Linux、mac 等系统,支持循环处理、多进程、递归处理、还可以结合 linux 的命令来查看处理情况,等进度展示。
安装
pip install tqdm
或者
conda install -c conda-forge tqdm
对于可以迭代的对象都可以使用下面这种方式,来实现可视化进度,非常方便
from tqdm import tqdm
import time
for i in tqdm(range(100)):
time.sleep(0.1)
pass
tqdm(range()) 可以替换成 trange()
from tqdm import tqdm,trange
import time
for i in trange(100):
time.sleep(0.1)
pass
手动设置处理的进度
from tqdm import tqdm
import time
# total参数设置进度条的总长度
with tqdm(total=100) as pbar:
for i in range(100):
time.sleep(0.1)
# 每次更新进度条的长度
pbar.update(10)
不用 with 也可以
from tqdm import tqdm
import time
#total参数设置进度条的总长度
pbar = tqdm(total=100)
for i in range(100):
time.sleep(0.05)
#每次更新进度条的长度
pbar.update(10)
#关闭占用的资源
pbar.close()
多层循环
from tqdm import tqdm
import time
for i in tqdm(range(20), ascii=True,desc="1st loop"):
for j in tqdm(range(10), ascii=True,desc="2nd loop"):
time.sleep(0.01)
9、Cython
Cython是一种编程语言,它是 Python 语言的超集,旨在通过结合 Python 的语法和 C 数据类型及函数来提升代码的运行速度。
一、Cython 的定义与特点
-
定义:Cython 可以理解为具有 C 数据类型的 Python,通过将 Cython 编译为 C 语言,可以提升代码的性能。
-
特点:
- 保留了Python开发方便的特点。
- 提升了代码的运行速度,尤其对于数值运算等操作效果显著。
- 可以直接调用C语言库(还支持C++库),省去了 Python 和 C 之间来回切换花费的时间。
- 生成的 C 代码要比手写的 C 代码安全得多,因为 Cython 通过装饰器和编译器指令来自动检查 C 代码运行时的问题,例如越界访问数组就会报错。
二、Cython的安装
在Linux系统下,可以通过 pip 命令安装 Cython:
pip install Cython
安装完毕后,执行 cython --version
命令,如果输出了版本号,即表示安装成功。
三、Cython的使用
创建Cython项目:
- 创建一个.pyx文件,该文件包含Cython代码。
- 创建一个setup.py文件,用于编译Cython代码。
编写Cython代码:
- 在.pyx文件中,可以使用Python语法编写代码,同时可以使用Cython的类型声明语法来优化性能。
例如,可以使用cdef关键字来定义C语言类型的变量和函数。
编译Cython代码:
- 在 setup.py 文件中,使用 Cython.Build.cythonize 函数来指定要编译的.pyx文件。
执行 python setup.py build_ext --inplace 命令来编译 Cython 代码,这会生成一个与 .pyx文件同名的 .so(在Linux或macOS上)或 .pyd(在Windows上)文件,该文件是编译后的 Cython 扩展模块。
使用编译后的Cython扩展模块:
- 在Python代码中,可以像导入普通Python模块一样导入编译后的Cython扩展模块。
调用Cython扩展模块中的函数时,会获得比纯Python代码更快的执行速度。
四、Cython的局限性
- 对Python的原生数据结构作用不太明显:虽然Cython可以优化Python代码的性能,但对于使用Python原生对象的代码(如字符串、列表、元组、字典等),效果可能并不明显。
- 学习曲线:虽然Cython的语法与Python相似,但要充分利用其性能优化功能,需要掌握一些C语言的知识和Cython的特定语法。
五、Cython的应用场景
- Cython适用于需要提升Python代码性能的场景,尤其是对于那些数值运算密集或需要频繁调用C语言库的应用程序。通过使用Cython,开发者可以在保持Python代码简洁性的同时,获得接近C语言的执行速度。
综上所述,Cython是一种强大的工具,它结合了Python的易用性和C语言的性能优势。通过学习和使用Cython,开发者可以编写出既快速又易于维护的代码。
附录 A
collections
字符元素组成判定
from collections import Counter
a = "3abcd3"
b = "d3bc3a"
print(Counter(a) == Counter(b))
output
True
打印模块安装位置
import pandas
print(pandas) # <module 'pandas' from '/usr/local/lib/python3.8/site-packages/pandas/__init__.py'>
使用绝对/相对路径导入包
绝对导入可以使用 import <>
或 from <> import <>
语法,但相对导入只能使用 from <> import <>
形式
import 后面不能直接跟 ..
再看下例子加深对 import 的理解
python_package_dir_example = '''
parent/
__init__.py
one/
__init__.py
one/
__init__.py
two/
__init__.py
three/
__init__.py
上述目录结构在 import parent.one.one
时,会加载 parent.one
中的 __init__
附录 B
打印电脑信息
# 获取计算机信息
import wmi
def System_spec():
Pc = wmi.WMI()
os_info = Pc.Win32_OperatingSystem()[0]
processor = Pc.Win32_Processor()[0]
Gpu = Pc.Win32_VideoController()[0]
os_name = os_info.Name.encode('utf-8').split(b'|')[0]
ram = float(os_info.TotalVisibleMemorySize) / 1048576
print(f'操作系统: {os_name}')
print(f'CPU: {processor.Name}')
print(f'内存: {ram} GB')
print(f'显卡: {Gpu.Name}')
print("\n计算机信息如上 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑")
System_spec()
控制键盘鼠标
pyautogui是一款跨平台的自动化操作模块,可以用来操作我们的鼠标和键盘。
Note: 更多连载请查看【python】