Python编程——基础语法

编码

Python字符串以Unicode表示,一个字符占2个字节

UTF-8编码:英文字母1个字节,中文字符占3个字节

ord('A') # 字符->ASCII 
chr(65) # ASCII->字符  
'\u4e2d\u6587'
b'ABC' # bytes类型数据,每个字符占一个字节
'ABC' # 字符串为Unicode,两个字节表示一个字符
r'内部的字符串默认不转义'

通过encode()方法可以编码为指定的bytes

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
# 在bytes中,无法显示为ASCII字符的字节,用\x##显示

使用decode()方法把bytes变为str

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
# 如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节

进制

int('10',2) # 字符串转为二进制整型
bin(10) # 十进制转为二进制字符串 '0b1010'
oct(10) # 十进制转为八进制字符串 '0o12'
hex(10) # 十进制转为十六进制字符串 '0xa'

可变对象和不可变对象

可变数据类型 list, dict, set

不可变数据类型 int,string,float,tuple

函数的参数传递:不可变数据类型,传递复制,不会影响本身的值

格式化

1.使用%格式化

%s 字符串

%d 整数

%f 浮点

%x 十六进制整数

%% 表示 %

2.使用format()格式化

3.使用f-string()格式化

# %
'%.2f' % 3.1415926
​
# format
'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
​
# f-string 以f开头的字符串
r = 2.5
s = 3.14 * r ** 2
print(f'The area of a circle with radius {r} is {s:.2f}')

切片

s[:] # 原样复制list
s[::-1] # 逆序
s[::2] # 步进2取数

字符串也能进行切片操作

迭代

判断是否为可迭代对象

from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代

迭代索引-元素对

for index,value in enumerate([1,2,3]):
    print(index,value)

列表生成式

[x * x for x in range(1, 11)]
​
# for后面的if是过滤条件
[x * x for x in range(1, 11) if x % 2 == 0]
​
[m + n for m in 'ABC' for n in 'XYZ']
​
# for前面的if ... else是表达式
[x if x % 2 == 0 else -x for x in range(1, 11)]
# [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]

生成器

generator

一边循环一边计算,保存的是算法

1.使用()代替[]

g = (x * x for x in range(10))
​
next(g) # 获得下一个返回值
​
# 生成器可迭代
for n in g:
    print(g)

2.在函数中使用yield关键字,成为generator的函数

在每次调用next()的时候执行,遇到yield语句返回

再次执行时从上次返回的yield语句处继续执行

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

for n in fib(6):
    print(n)

模块

在Python中,一个.py文件就称之为一个模块(Module),按目录来组织模块的方法,称为包(Package)

每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是目录名

任何模块代码的第一个字符串都被视为模块的文档注释

__author__变量写入作者

if __name__=='__main__': # 命令行运行模块文件时执行,用于测试,导入模块时,不会执行
    test()
# python 模块.py 执行test
# import 模块.py 不执行

作用域:_xxx约定为private非公开变量,不应该被引用

module_name.path # 输出搜索路径

导出requirement.txt

pip freeze > requirements.txt

查看模块

pip list

升级pip

pip install -U pip

安装版本

pip install Packagename==1.0.0
pip install Packagename>=1.0.0

升级包

pip install --upgrade Packagename

查看包信息

pip show -f Packagename

迭代器

可迭代对象 Iterable

可以直接作用于for循环

1.集合数据类型 list、tuple、dict、set、str

2.生成器,生成器和带yield的生成器函数

迭代器 Iterator

可以直接作用于for循环,还可以使用next()调用

1.生成器

2.集合数据类型使用iter()函数进行转化,如:iter([])

错误处理

try except finally

finally一定会被执行

可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句

可以有多个except捕获不同类型的错误

错误类型和继承关系

记录错误

import logging
try:
    xxx
except Exception as e:
    logging.exception(e)

抛出错误

使用raise语句

raise ValueError('ValueError')

调试

使用断言assert

assert n != 0, 'n is zero!' # AssertionError: n is zero!

使用logging

import logging
logging.basicConfig(level=logging.INFO) # 默认为warning
​
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critial')

使用调试器pdb

python -m pdb xxx.py
命令 l 查看代码
命令 n 单步执行
命令 p 变量名 查看变量
命令 q 结束调试

使用pdb.trace()

import pdb
pdb.set_trace() # 运行到这里会自动暂停,进入pdb调试环境
# 命令p查看变量,命令c继续运行

交互模式

进入 python

退出 exit()

运行相应目录的python程序 python hello.py

退出程序 Ctrl+C

查看函数帮助信息 help(function)

多版本控制

Linux

安装

yum install python38

直接使用

which python
python路径 /usr/bin
​
python3.8
pip3.8

虚拟环境 virtualenv

路径不能有中文否则会报错

pip install virtualenv
virtualenv venv # 创建独立Python运行环境venv 默认不会复制第三方包, -p 指定python解释器
activate # 启动环境(在script目录下)
deactivate # 退出环境

Python执行

python -m venv env

Linux后台运行Python代码

nohup command &
nohup python -u test.py > test.txt 2>&1 &
​
说明:
2>&1 将标准错误输出重定向到标准输出
标准输入0 标准输出1 标准错误输出2
n >& m  将输出文件 m 和 n 合并
& 让程序在后台运行
​
jobs -l 查看后台运行任务
ctrl+z  任务暂停
ctrl+c  任务退出
fg      将后台任务,调到前台运行
bg      任务继续
kill    任务退出

其他

换行书写

在一行的末尾加上反斜杠\

在函数中使用全局变量

需要使用global进行声明

发表评论