Python笔记 — 数据类型、运算符、格式化输出、正则表达式

Python笔记

1.数据类型

基本类型

int 整形

  • 定义:整数类型,包括正整数、负整数和零

  • 特点

    • Python 3中int类型可以表示任意大小的整数

    • 支持十进制、二进制(0b开头)、八进制(0o开头)、十六进制(0x开头)

  • 示例

    a = 10          # 十进制
    b = 0b1010      # 二进制,值为10
    c = 0o12        # 八进制,值为10
    d = 0xA         # 十六进制,值为10
    e = -5          # 负整数

float 浮点型

  • 定义:浮点数,用于表示带小数点的数字

  • 特点

    • 支持科学计数法表示(如1.23e-4)

    • 精度有限,可能存在浮点数精度问题

  • 示例

    a = 3.14
    b = -2.5
    c = 1.23e-4     # 科学计数法,等于0.000123
    d = float(3)    # 将整数转换为浮点数

bool 布尔型

  • 定义:逻辑值,只有True和False两个值

  • 特点

    • 实际上是int的子类,True对应1,False对应0

    • 常用于条件判断和逻辑运算

  • 示例

    a = True
    b = False
    c = 5 > 3       # 结果为True
    d = bool(0)     # 结果为False
    e = bool(1)     # 结果为True

complex 复数类型

  • 定义:复数,由实部和虚部组成

  • 特点

    • 虚部用j或J表示

    • 支持复数运算

  • 示例

    a = 3 + 4j      # 实部3,虚部4
    b = complex(2, 5)  # 创建复数2+5j
    c = a.real      # 获取实部,值为3.0
    d = a.imag      # 获取虚部,值为4.0

复合类型

str 字符串

  • 定义:由字符组成的序列,用于表示文本

  • 特点

    • 可以使用单引号、双引号或三引号定义

    • 字符串是不可变对象

    • 支持索引、切片和多种字符串方法

  • 示例

    s1 = 'Hello'
    s2 = "World"
    s3 = '''多行
    字符串'''

    # 字符串操作
    s4 = s1 + ' ' + s2  # 字符串拼接
    s5 = s1 * 3         # 字符串重复
    s6 = s1[0]          # 索引,获取'H'
    s7 = s1[1:4]        # 切片,获取'ell'
注意:三引号根据是否赋值来确定是注释还是字符串
  • 三引号'''xxx'''"""xxx"""是注释

  • s1='''xxx'''s1="""xxx"""是赋值字符串

list 列表

  • 定义:有序的可变序列,用方括号[]表示

  • 特点

    • 可以包含不同类型的元素

    • 支持增删改查操作

  • 示例

    lst = [1, 2, 3, 'hello', True]
    lst.append(4)       # 添加元素
    lst[0] = 10         # 修改元素
    del lst[1]          # 删除元素

tuple 元组

  • 定义:有序的不可变序列,用圆括号()表示

  • 特点

    • 创建后不能修改

    • 常用于存储不可变数据

  • 示例

    tup = (1, 2, 3, 'hello')
    tup2 = 1, 2, 3      # 可以省略括号

dict 字典

  • 定义:键值对集合,用花括号{}表示

  • 特点

    • 键必须是不可变类型(字符串、数字、元组)

    • 值可以是任意类型

  • 示例

    d = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
    d['age'] = 26       # 修改值
    d['gender'] = 'F'   # 添加新键值对

set 集合

  • 定义:无序的不重复元素集合

  • 特点

    • 自动去重

    • 支持集合运算(并集、交集、差集)

  • 示例

    s = {1, 2, 3, 3, 2}  # 实际为{1, 2, 3}
    s.add(4) # 添加元素
    s.remove(2) # 删除元素

类型转换

Python提供了内置函数进行类型转换:

int(x)      # 转换为整数
float(x) # 转换为浮点数
str(x) # 转换为字符串
bool(x) # 转换为布尔值
list(x) # 转换为列表
tuple(x) # 转换为元组
dict(x) # 转换为字典
set(x) # 转换为集合

类型检查

使用type()函数检查变量类型:

type(10)        # <class 'int'>
type(3.14) # <class 'float'>
type('hello') # <class 'str'>
type(True) # <class 'bool'>

2.格式化输出

print()[老字符串方法]

name = "张三"
age = 18
print("我叫",name,"今年",sex, sep="")

str.format()[新字符串方法]

name = "张三"
age = 18
print("我的姓名:{},我的年龄:{}".format(name,age))
name2 = "李四"
age2 = 20
print("我的姓名:{name},我的年龄:{age}".format(name=name2,age=age2))

f-strings[Python 3.6+]

f-strings是Python3.6版本中引入的一种新的字符串格式方法。它们提供了一种简洁,直观且性能优异的方式来嵌入变量和表达式的值到字符串中,该方法简单易读。

基本使用

f-strings通过在字符串前加上fF来标识,并允许在字符串中直接嵌入表达式。表达式被大括号{}包围,其计算结果将被转换为字符串并插入到相应的为止。

示例:
name = "张三"
age = 18
sex = "女"
print(f"我的名字:{name},我的年龄:{age},我的性别:{sex}")
print(F"我的名字:{name},我的年龄:{age},我的性别:{sex}")

”’
输出结果:
我的名字:张三,我的年龄:18,我的性别:女
我的名字:张三,我的年龄:18,我的性别:女
”’

表达式支持

n1 = 3
n2 = 4
# 输出 3*4=12
print(f"{n1}*{n2}={n1*n2}")

设置整数位数

对于整数,可以设置其显示的最小宽度,并使用零或空格填充字符已达到该宽度。使用零为填充字符时,整数前面会填充零,而使用空格填充字符时,整数前面会填充空格。

示例:
sid = 1
print(f"我的学号是:{sid:03d}")
print(f"他的学号是:002")
# 输出结果
'''
我的学号是:001
他的学号是:002
'''

设置浮点数位数

对于浮点数,可以设置其显示的小数位数。使用:.n格式,其中n为小数位数。

示例:
pi = 3.141592653589793
print(f"PI保留两位小数:{pi:.2f}")
# 输出结果
'''
PI保留两位小数:3.14
'''

3.运算符

算术运算符

运算符 描述 示例
+ 加法 a + b
- 减法 a - b
* 乘法 a * b
/ 除法 a / b
// 整除 a // b
% 取余 a % b
** 指数(幂):** a ** b
  • 除法(/)返回浮点数结果,而整除(//)返回整数结果。

  • 取余(%)返回两个操作数相除的余数。

运算符优先级

  • 先计算指数(**

  • 再计算乘法(*///%

  • 最后计算加法(+-

运算符优先级排序为:** > *///% > +-

# 优先级测试
print(10 - 8 / (3+1) * 6 // 2 + 15 % 2 ** 3)
# 输出结果:11.0

注意:除法和整除除数不能为0

注意://返回的结果是向下取整的结果

示例:

a = 10
b = 3
print(a + b) # 13
print(a - b) # 7
print(a * b) # 30
print(a / b) # 3.3333333333333335
print(a % b) # 1
print(a ** b) # 1000000000000000000

n = 2
m = 3
print(n ** m) # 8
print(m ** n) # 9

赋值运算符

在Python中,赋值运算符主要用于给变量赋值。在使用时,将右侧的值赋给左侧的变量,右侧也可以在进行某些运算后再赋值。

运算符 描述 实例
= 赋值 a = b
+= 加法赋值 a += b 等效于 a = a + b
-= 减法赋值 a -= b 等效于 a = a - b
*= 乘法赋值 a *= b 等效于 a = a * b
/= 除法赋值 a /= b 等效于 a = a / b
//= 整除赋值 a //= b 等效于 a = a // b
%= 取余赋值 a %= b 等效于 a = a % b
**= 指数赋值 a **= b 等效于 a = a ** b

关系运算符

逻辑运算符

逻辑运算符用于对布尔值进行逻辑运算,返回结果为布尔值。 通常用于判断多个条件是否同时满足。

a = True
b = False
print(a and b) # False
print(a or b) # True
print(not a) # False

逻辑运算符的优先级为:not > and > or

运算符 描述 示例
and a and b
or a or b
not not a

位运算符

输入函数 input()

input(__prompt=None)
# 参数:
# __prompt:提示信息,默认值为None,可忽略。当用户输入内容后,会将输入的内容作为字符串返回。__prompt=None时,不显示提示信息。

示例:

name = input("请输入姓名:")
print("你好,",name)
print(name, type(name))

”’
请输入姓名:123123
你好, 123123
123123 <class ‘str’>
”’

转义字符

转义字符用于在字符串中表示一些特殊字符,如换行、制表符、引号等。

转义字符 描述
\n 换行
\t 制表符
' 单引号
" 双引号
\\ 反斜杠
\b 退格
\f 换页
\r 回车
\uXXXX Unicode字符
\UXXXXXXXX Unicode字符

3.流程控制

if语句

简单的if语句

if 表达式:
语块

当表达式为True时,执行语块中的代码。 当表达式为False时,不执行语块中的代码。

age = 30
if age >= 18:
print("成年人")
else:
print("未成年人")

”’
输出结果:
成年人
”’

多分支if语句

if 表达式1:
语块1
elif 表达式2:
语块2
else:
语块3

当表达式1为True时,执行语块1中的代码。 当表达式2为True时,执行语块2中的代码。 当表达式1和表达式2都为False时,执行语块3中的代码。

wendu = 30
if wendu >= 30:
print("天气热")
elif wendu >= 20:
print("天气刚好")
elif wendu >= 10:
print("天气微凉")
else:
print("天气冷")
'''
输出结果:天气热
'''

三元表达式

三元表达式是一种简洁的if语句,用于根据条件判断执行不同的表达式。 语法:表达式1 if 条件 else 表达式2 当条件为True时,执行表达式1;当条件为False时,执行表达式2。

is_raining = False
if is_raining:
print("下雨了")
else:
print("没有下雨")
'''
输出结果:没有下雨
'''

print(“下雨了”) if is_raining else “没有下雨”
”’
输出结果:没有下雨
”’

# 另一种写法
a = 10
b = a > 10 and a or 5
print(b)
”’
输出结果:10
”’

if嵌套

if语句可以嵌套使用,用于判断多个条件是否同时满足。 当一个条件为True时,再判断另一个条件是否为True。 当一个条件为False时,不执行嵌套的if语句。

# 需求:检查学生的成绩和出勤率以决定其是否获得奖学金
# 定义一个变量保存学生的成绩
score = 90
# 定义一个变量保存学生的出勤率
attendance = 0.9

# 使用if嵌套方式实现:
if score >= 80:
if attendance >= 0.85:
print(“获得奖学金”)
else:
print(“未获得奖学金”)
else:
print(“未获得奖学金”)

# 使用逻辑运算符直接判断:
if score >= 95 and attendance >= 0.9:
print(“获得奖学金”)
else:
print(“未获得奖学金”)

”’
输出结果:
获得奖学金
未获得奖学金
”’

4.正则表达式

正则表达式(Regular Expression)是一种用来匹配字符串的强大工具,Python通过内置的re模块提供支持。

含义

正则表达式是一种用于描述文本模式的代码,它定义了一系列规则来匹配字符串中的特定模式。这些模式可以非常灵活和复杂,能够用于识别和处理各种文本数据。

它是强大的字符串处理工具。在软件开发中,我们经常需要查找、验证或提取符合特定规则的字符串。例如,在网页爬虫或数据抓取任务中,我们可能需要从大量文本中提取出所有有效的邮箱地址或电话号码。这时,正则表达式就派上了大用场,它允许我们以一种高效且准确的方式来完成这些任务。

Python自1.5版本开始内置了 re 模块,该模块提供了完整的正则表达式功能。要使用正则表达式,首先需要导入Python的 re 模块。通过 re 模块提供的一系列函数,我们可以轻松地在Python程序中进行正则表达式的匹配、搜索、替换等操作。

re模块导入

import re

核心函数

函数 描述 返回值
re.search(pattern, string) 在整个字符串中搜索第一个匹配 Match对象 或 None
re.match(pattern, string) 从字符串开头匹配 Match对象 或 None
re.findall(pattern, string) 返回所有匹配的列表 list
re.finditer(pattern, string) 返回所有匹配的迭代器 iterator
re.sub(pattern, repl, string) 替换所有匹配项,返回新字符串 str
re.split(pattern, string) 按模式分割字符串,返回列表 list
re.compile(pattern) 编译正则表达式,提高复用效率 Pattern对象

基本示例

import re

text = “我的手机号是13812345678,座机是010-88886666”

# search:找到第一个匹配
result = re.search(r”\d{11}”, text)
print(result.group()) # 13812345678

# findall:找到所有匹配
phones = re.findall(r”\d[\d-]+”, text)
print(phones) # [‘13812345678’, ‘010-88886666’]

# sub:替换
masked = re.sub(r”\d{3}\d{4}\d{4}”, “***”, text)
print(masked) # 我的手机号是***,座机是010-88886666

# split:分割
s = “a,b;c|d e”
parts = re.split(r”[,;| ]”, s)
print(parts) # [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]

Match对象

re.search()re.match()返回Match对象,常用方法:

方法 描述
group() / group(0) 返回整个匹配的字符串
group(n) 返回第n个捕获组
groups() 返回所有捕获组的元组
start() 匹配的起始位置
end() 匹配的结束位置
span() 返回 (start, end) 元组
m = re.search(r"(\d{3})-(\d{8})", "电话:010-88886666")
print(m.group()) # 010-88886666
print(m.group(1)) # 010
print(m.group(2)) # 88886666
print(m.groups()) # ('010', '88886666')
print(m.span()) # (3, 15)

常用元字符

字符匹配

符号 含义 示例
. 匹配任意字符(除换行符) a.b 匹配 “acb”、”a#b”
\d 匹配数字 [0-9] \d{3} 匹配 “123”
\D 匹配非数字 \D 匹配 “a”、”#”
\w 匹配字母、数字、下划线 [a-zA-Z0-9_] \w+ 匹配 “hello_123”
\W 匹配非字母数字下划线 \W 匹配 “@”、”空格”
\s 匹配空白字符(空格、\t、\n) a\sb 匹配 “a b”
\S 匹配非空白字符 \S+ 匹配 “hello”
[abc] 匹配a、b、c中任意一个 [aeiou] 匹配元音字母
[^abc] 匹配除a、b、c外的任意字符 [^0-9] 匹配非数字
[a-z] 匹配a到z范围内任意字符 [A-Z] 匹配大写字母
| 或,匹配左右任意一个表达式 cat|dog 匹配 “cat” 或 “dog”

量词(重复)

符号 含义
* 重复0次或多次
+ 重复1次或多次
? 重复0次或1次
{n} 重复恰好n次
{n,} 重复至少n次
{n,m} 重复n到m次
# 量词演示
print(re.findall(r"\d{3}", "12 345 6789")) # ['345', '678']
print(re.findall(r"\d{2,4}", "12 345 6789")) # ['12', '345', '6789']
print(re.findall(r"ab*", "a ab abb abbb")) # ['a', 'ab', 'abb', 'abbb']
print(re.findall(r"ab+", "a ab abb abbb")) # ['ab', 'abb', 'abbb']
print(re.findall(r"ab?", "a ab abb abbb")) # ['a', 'ab', 'ab', 'ab']

贪婪匹配 vs 懒惰匹配

  • 默认是贪婪匹配:尽可能多地匹配

  • 量词后加?变为懒惰匹配:尽可能少地匹配

text = "<div>内容1</div><div>内容2</div>"

# 贪婪:匹配整个字符串
print(re.findall(r”<div>.*</div>”, text))
# [‘<div>内容1</div><div>内容2</div>’]

# 懒惰:匹配每个div
print(re.findall(r”<div>.*?</div>”, text))
# [‘<div>内容1</div>’, ‘<div>内容2</div>’]

边界匹配(锚点)

符号 含义
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配单词边界
\B 匹配非单词边界
print(re.findall(r"^\d+", "123abc"))      # ['123']  开头是数字
print(re.findall(r"\d+$", "abc123")) # ['123'] 结尾是数字
print(re.findall(r"\bcat\b", "cat concat")) # ['cat'] 完整单词

分组与捕获

# 普通捕获组 ()
m = re.search(r"(\d{3})-(\d{4})-(\d{4})", "电话:138-1234-5678")
print(m.groups()) # ('138', '1234', '5678')

# 命名捕获组 (?P<name>…)
m = re.search(r”(?P<area>\d{3})-(?P<number>\d{4}-\d{4})”, “138-1234-5678”)
print(m.group(“area”)) # 138
print(m.group(“number”)) # 1234-5678

# 非捕获组 (?:…)
m = re.search(r”(?:\d{3})-(\d{4}-\d{4})”, “138-1234-5678”)
print(m.groups()) # (‘1234-5678’,) 区号不捕获

# 反向引用 \n
print(re.search(r”(\w+)\s+\1″, “go go go”).group()) # go go
print(re.search(r”<(\w+)>.*?</\1>”, “<h1>标题</h1>”).group()) # <h1>标题</h1>

常用标志(Flags)

标志 含义
re.Ire.IGNORECASE 忽略大小写
re.Mre.MULTILINE 多行模式,^$匹配每行开头结尾
re.Sre.DOTALL .匹配包括换行符在内的所有字符
re.Are.ASCII 只匹配ASCII字符
re.Xre.VERBOSE 详细模式,可写注释和空白
text = "Hello\nWorld"

# 不匹配(第二行不是以H开头的整串)
print(re.search(r”^World”, text)) # None

# re.M多行模式
print(re.search(r”^World”, text, re.M).group()) # World

# re.I忽略大小写
print(re.findall(r”hello”, “Hello HELLO hello”, re.I)) # [‘Hello’, ‘HELLO’, ‘hello’]

# re.S让.匹配换行
print(re.search(r”Hello.World”, “Hello\nWorld”, re.S).group()) # Hello\nWorld

零宽断言

语法 含义
(?=...) 正向先行断言:后面是…
(?!...) 负向先行断言:后面不是…
(?<=...) 正向后行断言:前面是…
(?<!...) 负向后行断言:前面不是…
# 正向先行断言:匹配后面跟着数字的字母
print(re.findall(r"[a-z]+(?=\d)", "abc123 def456 xyz"))
# ['abc', 'def']

# 正向后行断言:匹配前面是@的用户名
print(re.search(r”(?<=@)\w+”, “用户@admin 登录”).group())
# admin

# 取价格(前面是¥的数字)
print(re.findall(r”(?<=¥)\d+”, “¥199 ¥299 ¥399”))
# [‘199’, ‘299’, ‘399’]

# 匹配不以大写字母开头-的字符串
re.search(r’^[A-Z](?<!Foo)\w+’, ‘Foobar’)
# None

compile预编译

当同一个正则表达式需要多次使用时,编译后效率更高:

pattern = re.compile(r"\d{3}-\d{8}|\d{4}-\d{7}")

print(pattern.search(“电话:010-88886666”).group()) # 010-88886666
print(pattern.search(“电话:0755-8888666”).group()) # 0755-8888666
print(pattern.findall(“010-88886666 0755-8888666”)) # [‘010-88886666’, ‘0755-8888666’]

实战示例

# 1. 验证邮箱
email = "user@example.com"
pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
print(bool(re.match(pattern, email))) # True

# 2. 提取URL
text = “访问 https://www.baidu.com 或 http://example.org”
urls = re.findall(r”https?://[^\s]+”, text)
print(urls) # [‘https://www.baidu.com’, ‘http://example.org’]

# 3. 提取中文
text = “Hello你好World世界”
print(re.findall(r”[\u4e00-\u9fa5]+”, text)) # [‘你好’, ‘世界’]

# 4. 驼峰转下划线
def camel_to_snake(name):
return re.sub(r”([A-Z])”, r”_\1″, name).lower().lstrip(“_”)

print(camel_to_snake(“getUserNameById”)) # get_user_name_by_id

# 5. 清洗HTML标签
html = “<p>这是<b>重要</b>内容</p>”
clean = re.sub(r”<[^>]+>”, “”, html)
print(clean) # 这是重要内容

# 6. 敏感词过滤
def filter_words(text, words):
for w in words:
text = re.sub(w, “*” * len(w), text)
return text

print(filter_words(“这是一个测试敏感词”, [“测试”, “敏感”]))
# 这是一个**的**词

正则示例:

# 导入re模块,正则表达式模块
import re

fgf = "----------------------------"

def fun():
    print(fgf)

res = re.match("o","hello")
print(res)
# None无法调用group()方法
# print(res.group()) # Traceback (most recent call last):AttributeError: 'NoneType' object has no attribute 'group'

fun()



res = re.match("h","hello")
print(res)
print(res.group()) # 输出结果:h

fun()

# .匹配任意字符
res = re.match(".","@")
print(res)
print(res.group()) # 输出结果:@

fun()

# [] 匹配方括号中的任意字符
res = re.match("[a-zA-Z0-9_]","hhsdfa123")
print(res.group()) # 输出结果:h

fun()
# * 匹配零个或多个前面的字符
# r 表示原始字符串,避免转义字符
# \d 匹配数字,等价于 [0-9]
res = re.match(r"\d*","124123aaa123")
print(res.group()) # 输出结果:124123

fun()
# + 匹配一个或多个前面的字符
res = re.match(r"\d+","124123aaa123")
print(res.group()) # 输出结果:124123

fun()

# ? 匹配零个或一个前面的字符
res = re.match(r"\d?","124123aaa123")
print(res.group()) # 输出结果:1
print(res.group(0)) # 输出结果:1
# print(res.group(1)) # 报错:IndexError: no such group
# print(res.group(2)) # 报错:IndexError: no such group

fun()
# {} 匹配前面的字符指定次数
res = re.match(r"\d{3}","123")
print(res.group()) # 输出结果:123
res = re.match(r"\d{3}","12asdf")
# print(res.group()) # 报错:AttributeError: 'NoneType' object has no attribute 'group'
res = re.match(r"\d{1,3}","12asdf") # 匹配1到3个数字
print(res.group()) # 输出结果:12

fun()

# ^ 匹配字符串的开头
res = re.match(r"^\d","123asd")
print(res.group()) # 输出结果:1
# 注意: ^ 在 [] 中,表示对 [] 中的字符取反,即匹配 [] 中的字符
res = re.match(r"[^0-9]","123a")
# print(res.group()) # 报错:AttributeError: 'NoneType' object has no attribute 'group'
res = re.match(r"[^0-9]","aa123a")
print(res.group()) # 输出结果:a
fun()

# $ 匹配字符串的结尾
res = re.match(r"\d+","123asd")
print(res.group()) # 输出结果:123
res = re.match(r"\d+$","123asd") # 结尾不是多个数字结尾
# print(res.group()) # 报错:AttributeError: 'NoneType' object has no attribute 'group'

res = re.match(r"\d+$","123")
print(res.group()) # 输出结果:123
fun()

# 匹配分组
res = re.match(r"\d|\s","122 sdf")
print(res.group()) # 输出结果:1

regex = r"\w+@\w+\.(com|cc|net)"
res = re.match(regex,"123456@qq.com")
print(res.group()) 

fun()

# \num 匹配第num个分组的内容
html = r"<html><head></head><body><span>你好</span></body></html>"
res = re.match(r"<\w+>.*</\w+>",html)
print(res.group()) # 输出结果:<html><head></head><body><span>你好</span></body></html>
res = re.match(r"<(\w+)>.*</\1>",html)
print(res.group()) # 输出结果:<html><head></head><body><span>你好</span></body></html>

res = re.search(r"<(\w+)><(\w+)>.*</\2></\1>",html)
print(res.group()) # 输出结果:<body><span>你好</span></body>
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容