最近有一直关注、浏览微信公众号文章中有关Python的技术文章,今天继续分享一些个人觉得比较有趣的库。
Jinja2——渲染字符串的强大引擎
Jinja2相信熟悉Flask框架的对它再熟悉不过了,它就是Flask使用的模板引擎。它能够在程序加载一个静态文件时,将文件中的占位符换成要替换的值。在bash中用pip就可以安装Jinja2。安装Flask框架时它也会一并安装Jinja2。
Jinja2最常用的类就是Template,即模板类。它和字符串格式化有些类似,参照下方的示例代码。
python 代码:from jinja2 import Template
tmp = Template('Author: {{ name }}')
name = '棋'
print(tmp.render(name=name))
# Author: 棋
它和f'Author: {name}'有点像。
Jinja2支持很多结构,接下来分点来介绍。
- 变量类型
它支持很多变量,最基本的就是Python的内置类型,比如bool,数值型和字符串型。
python 代码:from jinja2 import Template
tmp_str = '''
布尔型:{{ bool }}
数值型:{{ number }}
字符串型:{{ str }}
'''
bool = True
number = 123
str = 'string'
tmp = Template(source=tmp_str)
print(tmp.render(bool=bool, number=number, str=str))
# 布尔型:True
# 数值型:123
# 字符串型:string
Jinja2也支持元组、列表等变量。
python 代码:from jinja2 import Template
tmp_str = '''
元组:{{ tuple }}
集合:{{ set }}
列表:{{ list }}
字典:{{ dict }}
'''
tuple = ('这', '是', '一个', '元组')
set = {1, 2, 3, 4}
list = [5, 6, 7, 8]
dict = {'类别': '文章', '名称': 'Python实用库推荐'}
tmp = Template(source=tmp_str)
print(tmp.render(tuple=tuple, set=set, list=list, dict=dict))
# 元组:('这', '是', '一个', '元组')
# 集合:{1, 2, 3, 4}
# 列表:[5, 6, 7, 8]
# 字典:{'类别': '文章', '名称': 'Python实用库推荐'}
还支持对象属性。
python 代码:from jinja2 import Template
tmp_str = '''
对象变量:{{ obj.value }}
对象方法:{{ obj.f() }}
'''
class Obj:
def __init__(self, value):
self.value = value
def f(self):
return '调用对象方法' + self.value
obj = Obj('变量')
tmp = Template(source=tmp_str)
print(tmp.render(obj=obj))
# 对象变量:变量
# 对象方法:调用对象方法变量
需要注意的是,由于Python是弱类型语言的特性,传入变量时不会进行类型检查,而有错误时要运行才能判断出,因此需要在开发时就要注意变量的一致性。
Jinja2还支持简单的控制结构,如判断、循环。下面举一个简单的例子。
python 代码:from jinja2 import Template
tmp_str = '''
控制结构:判断数字大小
{% if number >= 3 %}
number大于3
{% elif number >=2 %}
number大于2
{% else %}
number小于2
{% endif %}
循环结构:遍历列表的值
{% for item in list %}
{{ item }}
{% endfor %}
'''
tmp = Template(source=tmp_str)
print(tmp.render(number=2, list=[1, 2, 3, 4, 5]))
sympy——解决常见数学问题的强大工具
虽然我不是很会数据分析,但是我觉得这个库的功能很有趣,所以分享给大家。使用pip就可以安装这个库。这个库可以因式分解、多项式展开等等,具体直接看下方的例子。
- 因式分解
首先,我们需要使用 Symbol 定义一个变量,它使得变量可以应用于 sympy 的代数方法。
定义 “Symbols” 后,我们可以借助 factor() 函数轻松获取表达式的因子。
from sympy import Symbol, factor
x = Symbol('x')
y = Symbol('y')
expr = (x - 2) * (x - 2) - (y - 3) * (y - 3)
print(factor(expr))
# (x - y + 1)*(x + y - 5)
也可以一次性定义多个变量。
python 代码:from sympy import symbols,factor
x, y = symbols("x y")
expr = (x - 2) * (x - 2) - (y - 3) * (y - 3)
print(factor(expr))
两者运行结果是一致的。
- 扩展
扩展就是将因式展开成多项式,使用expand()方法即可。
python 代码:from sympy import Symbol, expand
x = Symbol("x")
y = Symbol("y")
expr = (x - y + 1) * (x + y - 5)
expr = expand(expr)
print(expr)
# x**2 - 4*x - y**2 + 6*y - 5
展开的多项式也是Python风格的。
- 表达式求解
表达式求解就是知道某些变量的值和一组变量构成的表达式,将变量带入表达式求值。调用subs()方法即可。
python 代码:from sympy import Symbol
x = Symbol("x")
y = Symbol("y")
expr = x ** 2 + y
result = expr.subs({x: 2, y: 1})
print(result) # 5
- 解方程
需要解方程时,Python会将表达式的等号右侧变为0。如表达式x**2就代表方程x**2=0。调用solve()方法就可以解方程。
python 代码:from sympy import symbols, solve
x = symbols('x')
expr = x**2 + 4
print(solve(expr)) # [-2*I, 2*I]
这里的I就是虚数单位。
同样地,它也可以解方程组。
python 代码:from sympy import symbols, solve
x, y = symbols('x, y')
expr1 = x + y - 2
expr2 = x - y + 2
print(solve((expr1, expr2))) # {x: 0, y: 2}
需要注意的是solve()方法接受的参数为元组。
研究数据分析或者机器学习需要进行数学计算的可以了解一下这个小众的库。
这几天也看到了一些其他有趣的库,这里不做过多介绍了,直接演示下它们的功能。
nicegui——新一代的全能GUI框架
这个框架实际上出了有一段时间了,但是以前有寻找过很多GUI框架,得到的答案都是步骤繁琐。虽然它们的功能非常全面,但是一个简单的窗体就要几十行代码(Java也是)。最近浏览微信公众号时,看到有很多人都提及到了nicegui,实际体验了一下,真的感觉非常简洁。它既能构建Web应用,也能打包成exe文件。且实现一个简单的窗体也不需要像Tkinter,Pyqt5那样需要写几十行代码,充分体现了Python的简洁性。在接下来的一段时间,我打算学习一下nicegui。我也会将这部分记录在云笔记中。
下面简要介绍一下这款简洁的框架。首先就是安装。使用如下的命令直接安装即可。
bash 代码:pip install NiceGUI
先来编写一个简单的页面。
python 代码:from nicegui import ui
ui.label('开始学习nicegui')
ui.run()
运行这段代码,控制台会出现如下内容。
NiceGUI ready to go on http://localhost:8080, http://10.122.181.73:8080, http://172.22.240.1:8080, and http://172.31.96.1:8080 (install netifaces to show all IPs and speedup this message)
然后在浏览器中打开任一链接,就可以看到输出的内容。值得一提的是,nicegui是以fastAPI驱动的。
它既然是GUI框架,当然也可以以窗体方式显示。首先在bash中输入pip install pywebview安装pywebview,然后在ui.run()中指定关键字参数native参数为True即可(默认为False,即在浏览器中显示)。
python 代码:from nicegui import ui
ui.label('这是一个示例窗体')
ui.run(native=True)

可以看到它和Web界面是很类似的。
再来看一下nicegui的进阶用法:创建多个组件和在一行中显示组件。
python 代码:from nicegui import ui
ui.label('这是一个标签')
with ui.row():
ui.input('输入框')
ui.button('按钮')
ui.run(native=True)

nicegui也支持事件驱动,如点击按钮后在控制台输出内容。先定义一个函数,然后为按钮指定on_click参数即可,和PyQt5的槽函数有些类似。
python 代码:from nicegui import ui
def func():
print('点击了按钮')
ui.label('这是一个标签')
with ui.row():
ui.input('输入框')
ui.button('按钮', on_click=func)
ui.run(native=True)
最后就是打包成exe。nicegui的优点就是它可以打包成单独的exe文件,在其他没有安装Python的电脑中也能运行。
打包成exe前,需要先指定run函数的reload参数为False,native参数为True,这是必须的。
python 代码:# main.py
from nicegui import ui
def func():
print('点击了按钮')
ui.label('这是一个标签')
with ui.row():
ui.input('输入框')
ui.button('按钮', on_click=func)
ui.run(reload=False, native=True)
然后新建一个build.py文件,这个就是打包的Python文件。在里面写入以下代码。
python 代码:# build.py
import os
import subprocess
from pathlib import Path
import nicegui
cmd = ['PyInstaller',
'main.py', # 运行ui.run()代码的文件
'--name', 'myapp' # 你的App名称
'--onefile',
'--windowed',
'--clean',
'--add-data', f'{Path(nicegui.__file__).parent}{os.pathsep}nicegui'
]
subprocess.call(cmd)
运行此文件即可。执行后dist文件夹会出现刚刚创建的exe文件。因为我在此项目中安装的库很多,因此打包成的exe文件也很大。建议安装venv环境,在此环境中打包。

那个UI不错!
有时间打算单独学习下,太有趣了!
多学点好
暂无点赞
暂无点赞
暂无点赞