python编程小知识

python基础小知识

字符串

r保持字符串

# 此时\n会转义为换行符
print('s\ntr')

img

# 第1种防止转义
print('s\\ntr')

img

# 第2种防止转义
print(r's\ntr')

img

\符号

作为转义字符

# 此时\n会转义为换行符
print('s\ntr')

作为续行字符

print('name \
xss')

img

*复制字符串

print('new'*2)

img

字符串索引

字符串支持从前到后0-len(str)进行遍历,也支持从[-1, -(len(str))]进行反向遍历

str='hello world'
print(str[len(str)-1])
print(str[-1])

img

'''3引号

'''3引号可以用来实现一个字符串跨多行

name='''
niadshid
shidhaid
'''

\r回车符号

\r回车符号,会将后面的字符覆盖前面的,字符可以用来实现进度条

print('hello\rworld') # 输出world

img

字符串内建函数

str='aces'
str.capitalize() # 字符串第1个转换为大小,输出为Aces
str.swapcase() # 将字符串中字母的大小颠倒
str.title()  # 将字符串标题化
center(width, fillchar) # 返回一个指定宽度居中的字符串,填充字符为fillchar,默认是空格
count(str, begin, end) # 计算字符str在字符串范围内[begin, end]内的数量
endwith(suffix, begin, end) # 查看字符串范围内是否以suffix结尾
startswith(substr, begin, end) # 查看字符串是否以substr开头
expandtabs(tabsize=8) # 将tab转为空格
find(str, begin, end) # 查找字符,如果找到则返回索引,否则返回-1
index(str, begin, end) # 查找字符,如果找不到会抛出异常
isalnum() # 是否字母和数字
isalpha() # 是否是字母
isdigit() # 是否是数字
islower() # 是否都是小写
isnumeric() # 是否只包含数字
isspace() # 是否是空格
istitle() # 字符串是否是标题化的
str.join(seq) # 以str为字符连接序列中的元素
stripe # 去掉两侧空格
lstrip(str) # 截掉左边空格或者指定字符
rstipe() # 截掉右边空格或者指定字符
max(str) # 返回字符串中最大的
min(str) # 返回字符串中最小的
str.replace(old, new, times) # 将str中old字符串替换为new字符串,最多替换times次 
rfind() # 从右侧找
split(str, num) # 以分隔符截取字符串,num指定分割次数,所以会分割num+1个字符串
splitlines(True) # 表示包含换行符,将每行划分为一个列表
splitlines(False) # 默认就是不包含换行符的,将每行划分为一个列表

列表

同样也可以正反向索引,截取列表,列表是可变的

更新列表

list1.append('name') # 增加一个元素
del list1[2] # 删除列表中第3个元素

列表基础操作

列表基础操作支持+,*,in

for x in list1: print(x, end=' ')

列表嵌套

x=[[1,2,3],[4,5,6]]
x[0][1]

集合

集合被一个{}围绕,可以使用set()创建一个空集合,集合会自动去除重复元素
支持对集合取&交集、|并集、-差集、^两集合中同时不存在的元素

nset=set()

字典

字典与列表的区别是,字典是通过键值进行索引,列表通过偏移进行索引,典型的字典如

dict={"key1": "value1",
"key2": "value2", 3:'value3'}
print(dict[3]) # 输出value3
print(dict.keys()) # 输出所有的key
print(dict.values()) # 输出所有的值

img

运算符

is运算符

is==的运算符的区别是,is判断的变量引用的对象是否是同一个,==只是判断值是否相同

a=[1, 2, 3]
b=a
print(b is a) # 返回 true
b=a[:]
print(b is a) # 此时b是一个新的对象,
# 对于可变类型(如列表),b = a[:]会创建一个新的对象,b和a是不同的对象。

img

json库

jsondata='''
{
    "name": "Alice",
    "age": 25,
    "address": {
        "street": "123 Main St",
        "city": "Wonderland",
        "zip": "12345"
    },
    "hobbies": ["reading", "gaming", "traveling"],
    "friends": [
        {"name": "Bob", "age": 23},
        {"name": "Charlie", "age": 24}
    ]
}
'''
json.loads(jsondata) # 从字符串读入
with open(file, 'r') as fp
    json.load(fp) # 从文件读入json信息

re库正则表达式

re库支持正则表达式,兼容perl的正则表达式

match接口

从起始位置开始匹配,匹配成功返回匹配的对象,否则返回None

re.match(pattern, string, flags=0)
re.match(pattern, string).span() # 返回匹配到的跨度范围(start, end)

search接口

从整个字符串内容中搜寻匹配样式的字符串,并返回第1个成功的匹配,匹配不成功返回None

re.search(pattern, string, flags=0)
name='hello are world'
obj=re.search('(.*) are ([0-9]*))', name) # 返回匹配对象
obj=re.search(r'(.*) are (\d*))', name)
obj.group() # 显示所有匹配的元素
obj.group(1) # 显示第1个匹配组的元素
obj.group(2) # 显示第2个匹配组的元素

img

sub替换接口

替换字符串中的匹配项

re.sub(pattern, repl, string, count=0, flags=0)
# repl要替换成的字符串(或者函数),string原始的字符串, count=0代表替换所有匹配

compile编译接口

用于编译正则表达式,生成一个正则表达式对象,可以给match、search、findall函数使用

pattern=re.compile(pattern[, flags])
pattern.match('ssahdiashdi', 3, 10) # 从第3个字符到第10个字符之间匹配
pattern.findall('sssssasdada') # 找到所有的匹配,返回列表

split划分接口

re.split(pattern, string[, maxsplit=0, flags=0]) # maxsplit指定划分次数,如果设置为0,代表不限制次数

标志位

# 可选的flags是如下
re.I # 忽略大小写
re.L # 表示特殊字符集
re.M # ^和$默认只匹配字符串的开头和结尾,不会进行多行的开头和结尾匹配
re.S # 使.匹配所有字符,默认.不匹配换行符
re.x # 允许正则表达式中包含空白字符和注释
re.U # 启用unicode模式,匹配unicode字符
re.A # 只匹配ASCII字符
re.A | re.I # 组合标志位

正则表达式基础规则

字符匹配

. # 匹配任意单个字符,默认不匹配换行符,除非标志位有re.S支持匹配所有的单个字符
\w # 匹配任意字母、数字或下划线,等价于[0-9A-Za-z_]
\W # 匹配任意非字母数字下划线字符,等价于[^a-zA-Z0-9_]
\d # 匹配任意数字,等价于[0-9]
\D # 匹配任意非数字,等价于[^0-9]
\s # 匹配任意空白字符,包括空格、制表符\t、换行符\n等
\S # 匹配任意非空白字符,等价于[^\t\n\r\f\v]
[abc] # 匹配括号内任意字符
[^abc] # 匹配不在括号内的任意字符
[a-z] # 匹配范围内的任意字符

锚点

^ # 匹配字符串的开头,多行模式下匹配每一行的开头, ^world
$ # 匹配字符串的结尾,多行模式下匹配每一行的结尾, world$
\b # 匹配单词边界,单词与非单词字符之间的位置
\B # 匹配非单词边界

量词

* # 匹配字符或者子模式0次或多次
+ # 匹配字符或者子模式1次或多次
? # 匹配字符或者子模式0次或多次
{n} # 匹配字符或者子模式恰好n次
{n,} # 匹配字符或者子模式至少n次
{n,m} # 匹配字符或者子模式至少n次,最多m次
*? # 尽可能少的匹配字符
+?
??

分组或引用

(...) # 括号内表达式分组,捕获匹配的内容, (ab)+匹配abab
\1 # 匹配前面捕获的分组内容
\2 # 匹配前面捕获的分组内容
(?:..) # 非捕获式匹配,不保存分组内容
` # 匹配多个模式中的任意1个

其它特殊符号

\ # 转义字符,\.意味着只匹配.

条件判断

ret=None
if not ret:
    print('hello') # 此时会走到这个分支
if type(ret) is not list:
    print('var ret is not list type')

函数嵌套

print('hello')
def hi():
    print('name')

def happy(func):  # 支持使用func代替要传入的函数对象
    print('appache')
    func()

happy(hi)

函数装饰器decorator

函数装饰器,必须返回一个可用的打包函数对象

普通方式

print('hello')
def happy(func):
    def wrapper():
        print('appache')
        func()

    return wrapper    

@happy
def hi():
    print('name')


hi()
print(hi.__name__) # 输出的是wrapper, 此时重写了函数名

更标准的方式

from functools import wraps
print('hello')
def happy(func):
    @wraps(func) # 解决重写函数名问题
    def wrapper():
        print('appache')
        func()

    return wrapper    

@happy
def hi():
    print('name')


hi()

print(hi.__name__) # 输出的是wrapper

适用场景:

日志场景,可以用来给以前的代码做日志打印

logging日志模块

import logging

from functools import wraps

# 获取日志记录器
logger=logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 添加控制台处理器
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)

# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - [%(levelname)s]: %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

print('hello')
def happy(func):
    @wraps(func)
    def wrapper():
        logger.info("this is a log system")
        func()

    return wrapper    

@happy
def hi():
    print('name')


hi()

print(hi.__name__) # 输出的是wrapper

posted @ 2025-03-09 21:30  LemHou  阅读(8)  评论(0)    收藏  举报