Python

时间:2025-04-26 15:54:37

1、Python 基础知识

1、输入输出

是与用户进行交互的重要部分。

# 控制台输入
-------------------------------------------------------
# 从控制台读取输入
name = input("Enter your name: ")
print(f"Hello, {name}!")

'''
Enter your name: 小宏运维有点菜
Hello, 小宏运维有点菜!
'''

# 读取整数输入
age = int(input("Enter your age: "))
print(f"You are {age} years old.")

'''
Enter your age: 18
You are 18 years old.
'''

# 读取整数输入
age = int(input("Enter your age: "))
print(f"You are {age} years old.")

'''
Enter your age: 18
You are 18 years old.
'''
# 控制台输出
-------------------------------------------------------
# 打印字符串
print("Hello, World!")

'''
Hello, World!
'''

# 打印多个值
a = 10
b = 20
print("The values are:", a, b)

'''
The values are: 10 20
'''

# 格式化字符串
name = "小宏运维有点菜"
age = 18
print(f"My name is {name} and I am {age} years old.")

'''
My name is 小宏运维有点菜 and I am 18 years old.
'''

# 使用字符串格式化方法
print("My name is {} and I am {} years old.".format(name, age))

'''
My name is 小宏运维有点菜 and I am 18 years old.
'''

2、注释

注释是用来解释代码的文本,对于代码的理解和维护非常重要。

Python支持两种类型的注释:单行注释和多行注释。

# 这是一个单行注释

# x = 5  


------------------------------------------------------------

'''''' 这是多行注释

'''
这是一个多行注释示例。
它可以跨越多行,用于详细解释函数或类的功能。
'''

3、pass

pass 是一个空语句,它不执行任何操作。它通常用作占位符,用于语法上需要语句但又不需要实际操作的情况。pass 的存在使得代码结构更加完整。

my_list = [1, 2, 3, 4, 5]
for item in my_list:
    if item % 2 == 0:
        # TODO: 处理偶数
        pass
    else:
        # TODO: 处理奇数
        pass

4、运算符

运算符用于执行各种操作,例如算术运算、比较运算、逻辑运算等。

# 算数运算法
a = 10
b = 3

# 依次:加、减、乘、除、整除(商)、取余数、幂运算
print(a + b)  # 输出: 13 
print(a - b)  # 输出: 7
print(a * b)  # 输出: 30
print(a / b)  # 输出: 3.3333333333333335
print(a // b) # 输出: 3
print(a % b)  # 输出: 1
print(a ** b) # 输出: 1000

-------------------------------------------------------------------------------

# 比较运算法
x = 10
y = 5

# 依次:等于、不等于、大于、小于、大于等于、小于等于
print(x == y)  # 输出: False
print(x != y)  # 输出: True
print(x > y)   # 输出: True
print(x < y)   # 输出: False
print(x >= y)  # 输出: True
print(x <= y)  # 输出: False

-------------------------------------------------------------------------------

# 逻辑运算符
a = True
b = False

# 依次:与,所有条件为真时结果为真、  或,任意条件为真时结果为真、  非,反转条件的真假
print(a and b)  # 输出: False
print(a or b)   # 输出: True
print(not a)    # 输出: False

5、字符串

字符串格式化是将变量值、表达式或其他字符串插入到字符串中的一种方法,以便动态地生成字符串。

# 格式化字符串 %
name = "小宏运维有点菜"
age = 18
formatted_string = "Name: %s, Age: %d" % (name, age)
print(formatted_string)

'''
Name: 小宏运维有点菜, Age: 30
'''

-----------------------------------------------------------------------------

# 使用 () 格式化字符串
name = "小宏运维有点菜"
age = 18
formatted_string = "Name: {}, Age: {}".format(name, age)
print(formatted_string)

'''
Name: 小宏运维有点菜, Age: 25
'''

----------------------------------------------------------------------------

# 使用 f-strings 格式化字符串
name = "小宏运维有点菜"
age = 18
formatted_string = f"Name: {name}, Age: {age}"
print(formatted_string)

'''
Name: 小宏运维有点菜, Age: 20
'''

---------------------------------------------------------------------------

# 使用字典格式化字符串
person = {'name': 'xiaohong', 'age': 18}
formatted_string = "Name: {name}, Age: {age}".format(**person)
print(formatted_string)

'''
Name: xiaohong, Age: 28
'''

6、range

range() 是一个用于生成整数序列的内置函数。它常用于循环结构中,例如 for 循环,可以生成一系列按指定步长递增或递减的整数。

# 解释
range(start, stop, step)
start:序列的起始值,默认为 0。
stop:序列的结束值(不包含),必须指定。
step:序列的步长,默认为 1。

-------------------------------------------------------------------------

# 使用 range() 进行迭代:
for i in range(5):
    print(i)

'''
0
1
2
3
4
'''

--------------------------------------------------------------------------

# 指定步长
for i in range(1, 10, 2):
    print(i)

'''
1
3
5
7
9
'''

2、数据类型

1、列表:list

列表(list)是一种有序、可变的数据集合,用于存储一组任意类型的元素。列表是非常常用的数据结构,它支持增删改查等多种操作。

1. 使用 [] 创建列表,最常见的方法是使用方括号 [] 来创建一个空列表或包含元素的列表

# 创建一个空列表
empty_list = []

# 创建一个包含元素的列表
fruits = ['apple', 'banana', 'cherry']

----------------------------------------------------------------------------------

2.使用 list() 函数,可以使用 list() 函数将其他可迭代对象(如字符串、元组、集合等)转换为列表

# 使用 list() 函数从字符串创建列表
chars = list("hello")
print(chars)  # 输出: ['h', 'e', 'l', 'l', 'o']

# 使用 list() 函数从元组创建列表
numbers = list((1, 2, 3, 4))
print(numbers)  # 输出: [1, 2, 3, 4]

---------------------------------------------------------------------------------

3.访问列表元素,可以使用索引(从0开始)访问列表中的元素,也可以使用负索引从列表末尾开始计数

fruits = ['apple', 'banana', 'cherry']

print(fruits[0])    # 输出: 'apple'
print(fruits[-1])   # 输出: 'cherry'

---------------------------------------------------------------------------------

4.添加元素,使用 append() 方法在列表末尾添加元素:

fruits = ['apple', 'banana', 'cherry']
('orange')
print(fruits)  # 输出: ['apple', 'banana', 'cherry', 'orange']



4.1 使用 insert() 方法在指定位置插入元素

(1, 'grape')
print(fruits)  # 输出: ['apple', 'grape', 'banana', 'cherry', 'orange']

-------------------------------------------------------------------------------

5.删除元素,使用 remove() 方法删除指定值的元素

('banana')
print(fruits)  # 输出: ['apple', 'grape', 'cherry', 'orange']



5.1 使用 pop() 方法删除指定索引的元素(默认删除最后一个元素)

removed_fruit = (1)
print(fruits)         # 输出: ['apple', 'cherry', 'orange']
print(removed_fruit)  # 输出: 'grape'

-------------------------------------------------------------------------------

6.修改元素,可以直接通过索引对列表元素进行赋值修改

fruits[1] = 'pear'
print(fruits)  # 输出: ['apple', 'pear', 'cherry', 'orange']



6.1 列表切片,使用切片操作可以获取列表的子集

numbers = [1, 2, 3, 4, 5]
subset = numbers[1:4]
print(subset)  # 输出: [2, 3, 4]

2、字符串:string

字符串(string)是一种有序的字符序列,用于存储和表示文本信息。Python提供了丰富的字符串操作方法,包括创建字符串、访问字符串中的字符、字符串的拼接和切片、字符串方法以及格式化字符串等功能。

1.创建字符串

# 使用单引号创建字符串
single_quoted_string = 'Hello, Python!'

# 使用双引号创建字符串
double_quoted_string = "Hello, Python!"

-------------------------------------------------------------------

2.使用三引号创建多行字符串

multi_line_string = """
This is a multi-line
string in Python.
"""

-------------------------------------------------------------------

3.访问字符串中的字符,可以使用索引访问字符串中的单个字符,索引从0开始

my_string = "Hello"

print(my_string[0])    # 输出: 'H'
print(my_string[1])    # 输出: 'e'

-------------------------------------------------------------------

4.字符串切片(Slicing),使用切片操作可以获取字符串的子串

my_string = "Hello, Python!"

print(my_string[7:13])   # 输出: 'Python'

-------------------------------------------------------------------

5.字符串拼接,使用 + 号将两个字符串拼接起来

str1 = "Hello"
str2 = "Python"

concatenated_string = str1 + ", " + str2
print(concatenated_string)  # 输出: 'Hello, Python'

-------------------------------------------------------------------

6.字符串常用方法

upper():将字符串转换为大写字母。
text = "hello"
print(())  # 输出: HELLO

lower():将字符串转换为小写字母。
text = "HELLO"
print(())  # 输出: hello

strip():去除字符串两端的空格或指定字符。
text = "   hello   "
print(())  # 输出: hello

replace(old, new):将字符串中的指定子字符串替换为新的子字符串。
text = "Hello, World!"
print(("World", "Python"))  # 输出: Hello, Python!

split(separator):将字符串按指定分隔符拆分为列表。
text = "Hello, World!"
words = (", ")
print(words)  # 输出: ['Hello', 'World!']

find(substring):返回子字符串在字符串中首次出现的索引,如果未找到则返回 -1。
text = "Hello, World!"
print(("World"))  # 输出: 7

startswith(prefix):判断字符串是否以指定前缀开头。
text = "Hello, World!"
print(("Hello"))  # 输出: True

endswith(suffix):判断字符串是否以指定后缀结尾。
text = "Hello, World!"
print(("World!"))  # 输出: True

3、浮点型:float

浮点型(float)用于表示带小数点的实数。浮点数是不可变的,这意味着它们的值在创建后不能被改变。

import math  # 导入模块(要使用这个模块,必须先导入)

a = -3.14
b = 3.14

print(abs(a))          # 输出: 3.14  浮点数 x 的绝对值
print(round(b, 1))     # 输出: 3.1   浮点数 x 四舍五入到 n 位小数
print((b))    # 输出: 4     返回大于或等于 x 的最小整数
print((b))   # 输出: 3     返回小于或等于 x 的最大整数
print((16))   # 输出: 4.0   返回 x 的平方根

4、字典:Dictionary

字典是一种无序的数据集合,用 {} 来表示,每个元素是由键(key)和值(value)对组成的。字典中的键必须是唯一的,但值可以不唯一。

1.创建字典

# 使用 {} 创建字典
my_dict = {'name': '小宏运维有点菜', 'age': 18, 'city': 'New York'}

# 使用 dict() 函数创建字典
another_dict = dict(name='小宏运维有点菜', age=18, city='San Francisco')

------------------------------------------------------------------------

2.访问和操作字典

# 访问字典中的值
print(my_dict['name'])  # 输出: 小宏运维有点菜

# 添加新的键值对
my_dict['email'] = 'alice@'

# 修改键值对
my_dict['age'] = 31

# 删除键值对
del my_dict['city']

# 检查键是否存在
if 'email' in my_dict:
    print("Email found:", my_dict['email'])

# 遍历字典
for key, value in my_dict.items():
    print(key, ":", value)

5、集合:Set

集合是一种无序且元素唯一的数据结构,用 {} 来表示。集合中通常用来存储不重复的元素,支持基本的集合操作,如并集、交集、差集等。

1.创建集合

# 使用 {} 创建集合
my_set = {1, 2, 3, 4, 5}

# 使用 set() 函数创建集合
another_set = set([4, 5, 6, 7])

--------------------------------------------------------------------------------

2.集合操作

# 添加元素
my_set.add(6)

# 删除元素
my_set.remove(3)

# 检查元素是否存在
if 4 in my_set:
    print("4 is in the set")

# 遍历集合
for item in my_set:
    print(item)

6、元组:Tuple

元组是一种有序且不可变的数据结构,用 () 来表示。元组中的元素可以是不同的数据类型,一旦创建后就不能修改。

1.创建元组

# 使用 () 创建元组
my_tuple = (1, 2, 3, 'a', 'b', 'c')

--------------------------------------------------------

2.访问和操作元组

# 访问元素
print(my_tuple[0])   # 输出: 1

# 元组的切片
print(my_tuple[1:4]) # 输出: (2, 3, 'a')

# 元组是不可变的,不能修改元素
# my_tuple[0] = 10    # 这会引发 TypeError 错误

# 遍历元组
for item in my_tuple:
    print(item)

7、布尔类型:Bool

布尔类型只有两个值:TrueFalse,用于表示逻辑真和逻辑假。

1.创建布尔值

is_true = True
is_false = False

----------------------------------------------------------------------

2.布尔类型支持逻辑运算,如与、或、非:

a = True
b = False

print(a and b)   # 输出: False
print(a or b)    # 输出: True
print(not a)     # 输出: False

8、整形:int

整数(integer)是一种基本的数据类型,用于表示整数值。

1.创建整数

x = 5
y = -10

---------------------------------------------------------------

2.基本运算

a = 10
b = 3

print(a + b)  # 输出: 13
print(a - b)  # 输出: 7
print(a * b)  # 输出: 30
print(a / b)  # 输出: 3.3333333333333335 (除法总是返回浮点数)
print(a // b) # 输出: 3 (整除,返回整数部分)
print(a % b)  # 输出: 1 (取余数)
print(a ** b) # 输出: 1000 (幂运算)

---------------------------------------------------------------

3.类型转换:可以使用内置函数进行类型转换,将其他类型转换为整数

x = int(3.14)   # 将浮点数转换为整数,结果是 3
y = int("123")  # 将字符串转换为整数,结果是 123

9、空值:None

None 是一个特殊的常量,用于表示空值或不存在的值。它通常用于变量未赋值或函数没有返回值的情况。

3、推导式

推导式(comprehensions)是一种用简洁的语法从一个数据序列构建另一个数据序列的方法。推导式包括列表推导式、集合推导式、字典推导式和生成器表达式,它们可以在很大程度上简化代码并提高可读性。

1. 列表推导式(List Comprehensions),列表推导式提供了一种从一个列表中生成另一个列表的简洁方式。

numbers = [1, 2, 3, 4, 5]

# 获取所有偶数的平方
squares = [x**2 for x in numbers if x % 2 == 0]
print(squares)  # 输出: [4, 16]

-----------------------------------------------------------------------

2. 集合推导式(Set Comprehensions),集合推导式类似于列表推导式,但是生成的结果是一个集合。

numbers = [1, 2, 3, 4, 5]

# 获取所有偶数的平方
squares_set = {x**2 for x in numbers if x % 2 == 0}
print(squares_set)  # 输出: {16, 4}

-----------------------------------------------------------------------

3. 字典推导式(Dictionary Comprehensions),字典推导式允许从任意可迭代对象创建一个字典。

numbers = [1, 2, 3, 4, 5]

# 创建一个字典,键为数字,值为数字的平方
square_dict = {x: x**2 for x in numbers}
print(square_dict)  # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

-----------------------------------------------------------------------

4. 生成器表达式(Generator Expressions),生成器表达式与列表推导式类似,但是返回的是一个生成器对象,而不是一个列表。

numbers = [1, 2, 3, 4, 5]

# 创建一个生成器,用于迭代获取所有偶数的平方
squares_gen = (x**2 for x in numbers if x % 2 == 0)
print(squares_gen)  # 输出: <generator object <genexpr> at 0x7fc5a3e0b200>

# 使用生成器迭代获取结果
for square in squares_gen:
    print(square)  # 输出: 4 16

4、函数

4.1、内置函数

提供了一系列内置函数,这些函数在 Python 解释器启动时自动加载,不需要额外导入模块即可使用。

1. 数学相关函数

abs(x): 返回数字 x 的绝对值。
print(abs(-7))  # 输出: 7


max(iterable, *[, key, default]): 返回可迭代对象中的最大值。
print(max(1, 5, 2, 4))  # 输出: 5


min(iterable, *[, key, default]): 返回可迭代对象中的最小值。
print(min(1, 5, 2, 4))  # 输出: 1


sum(iterable, /, start=0): 返回可迭代对象的元素之和。
print(sum([1, 2, 3, 4]))  # 输出: 10


round(number, ndigits=None): 返回四舍五入后的值,ndigits是表示小数点后几位。
print(round(3.14159, 2))  # 输出: 3.14

-------------------------------------------------------------------------------------

2. 类型转换函数

int(x): 将 x 转换为整数。
print(int('10'))  # 输出: 10


float(x): 将 x 转换为浮点数。
print(float('3.14'))  # 输出: 3.14


str(x): 将 x 转换为字符串。
print(str(10))  # 输出: '10'


list(iterable): 将 iterable 转换为列表。
print(list('hello'))  # 输出: ['h', 'e', 'l', 'l', 'o']


dict(): 创建字典。
print(dict(a=1, b=2))  # 输出: {'a': 1, 'b': 2}


set(iterable): 将 iterable 转换为集合。
print(set([1, 2, 2, 3]))  # 输出: {1, 2, 3}


tuple(iterable): 将 iterable 转换为元组。
print(tuple('hello'))  # 输出: ('h', 'e', 'l', 'l', 'o')

---------------------------------------------------------------------------------

3. 序列相关函数

len(s): 返回对象的长度(元素个数)。
print(len('hello'))  # 输出: 5


sorted(iterable, *, key=None, reverse=False): 返回排序后的列表。
print(sorted([3, 1, 4, 2]))  # 输出: [1, 2, 3, 4]


reversed(seq): 返回序列的反转迭代器。
print(list(reversed([1, 2, 3])))  # 输出: [3, 2, 1]


enumerate(iterable, start=0): 返回枚举对象。
for index, value in enumerate(['a', 'b', 'c']):
    print(index, value)  # 输出: 0 a, 1 b, 2 c


zip(*iterables): 将多个可迭代对象压缩成元组组成的迭代器。
for item in zip([1, 2, 3], ['a', 'b', 'c']):
    print(item)  # 输出: (1, 'a'), (2, 'b'), (3, 'c')

---------------------------------------------------------------------------------

4. 其他常用函数
type(object): 返回对象的类型。
print(type(10))  # 输出: <class 'int'>


isinstance(object, classinfo): 判断对象是否是指定类或其子类的实例。
print(isinstance(10, int))  # 输出: True


id(object): 返回对象的唯一标识符。
x = 10
print(id(x))  # 输出: 对象 x 的唯一标识符


callable(object): 判断对象是否可调用。
def func():
    pass
print(callable(func))  # 输出: True

4.2、自定义函数

自定义函数可以帮助组织代码、提高代码的重用性和可读性。函数是一段执行特定任务的代码,可以通过函数名调用执行这段代码。

1.函数的定义与使用

1.定义函数:使用 def 关键字来定义函数,语法如下

def function_name(parameters):
    """
    Optional docstring
    """
    # Function body
    return result



'''
function_name 是函数的名称,命名应遵循标识符规则。
parameters 是函数的参数(也可以没有参数)。
函数体是执行的代码块,可以包含多条语句。
return 语句用于返回结果(可选)。
'''
2.使用函数

1. 无参数无返回值的函数
def greet():
    print("Hello, World!")

greet()  # 输出: Hello, World!


2. 带参数的函数
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")  # 输出: Hello, Alice!


3. 带返回值的函数
def add(a, b):
    return a + b

result = add(5, 3)
print(result)  # 输出: 8


4. 带默认参数的函数
def greet(name="Guest"):
    print(f"Hello, {name}!")

greet()         # 输出: Hello, Guest!
greet("Alice")  # 输出: Hello, Alice!


5. 带可变数量参数的函数,使用 *args 和 **kwargs 可以定义可变数量的参数。

# *args 用于接收任意数量的位置参数
def greet(*names):
    for name in names:
        print(f"Hello, {name}!")

greet("Alice", "Bob", "Charlie")  # 输出: Hello, Alice! Hello, Bob! Hello, Charlie!

# **kwargs 用于接收任意数量的关键字参数
def describe_person(**person):
    for key, value in ():
        print(f"{key}: {value}")

describe_person(name="Alice", age=30, city="New York")
# 输出:
# name: Alice
# age: 30
# city: New York

2、函数的作用域

局部变量:在函数内部定义的变量,只能在函数内部访问。

全局变量:在函数外部定义的变量,可以在函数内部访问。

x = 10  # 全局变量

def modify():
    global x
    x = 20  # 修改全局变量
    y = 5   # 局部变量
    print(y)

modify()
print(x)  # 输出: 20
# print(y)  # 这会引发 NameError,因为 y 是局部变量

3、Lambda 函数

Lambda 函数是一个匿名函数,用于定义简短的、一次性使用的函数。

add = lambda a, b: a + b
print(add(3, 5))  # 输出: 8

4、递归函数

递归函数是一个调用自身的函数,适用于分而治之的问题。

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))  # 输出: 120

# 这个看不懂可以私信我哈,用到了一个阶乘。

5、函数的嵌套

函数可以嵌套定义,也就是在一个函数的内部定义另一个函数。这种嵌套函数的用法可以用于封装逻辑、创建闭包和避免命名冲突。

def outer_function(msg):
    # 这是外部函数定义的地方
    
    def inner_function():
        # 这是内部函数定义的地方
        print(msg)  # 内部函数可以访问外部函数的变量
        
    # 调用内部函数
    inner_function()

# 调用外部函数
outer_function("Hello, from the inner function!")

6、闭包函数

闭包是指一个函数定义在另一个函数的内部,并且可以访问外部函数的变量,即使外部函数已经执行完毕。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

add_five = outer_function(5)
print(add_five(3))  # 输出: 8
print(add_five(10)) # 输出: 15

7、装饰器

不修改函数代码的前提下,给函数添加功能。装饰器本质上是一个函数,它接受一个函数作为输入并返回一个新的函数。

def outer(origin):
    def inner(*args, **kwargs):
        print("before 110")
        res = origin(*args, **kwargs)  # 调用原来的func函数
        print("after")
        return res

    return inner


@outer  # func1 = outer(func1)
def func1(a1):
    print("我是func1函数")
    # value = (11, 22, 33, 44)
    # return value

func1(1)

5、模块

1、自定义模块

自定义模块是由用户自己编写的模块,通常用来封装特定功能或逻辑。一个自定义模块本质上就是一个Python文件(后缀为 .py),其中包含了变量、函数、类等定义。

# 创建自定义模板
# my_module.py

def greet(name):
    return f"Hello, {name}!"

def add(a, b):
    return a + b

---------------------------------------------------------------------------

#使用自定义模板
# 

import my_module

print(my_module.greet("小宏运维有点菜"))  # 输出: Hello, 小宏运维有点菜!
print(my_module.add(3, 5))       # 输出: 8


#或者只导入特定函数
# 

from my_module import greet, add

print(greet("小宏运维有点菜"))  # 输出: Hello, 小宏运维有点菜!
print(add(2, 7))     # 输出: 9

2、第三方模块

第三方模块是由社区或公司开发并发布的模块,通常通过Python的包管理工具 pip 进行安装。这些模块可以提供各种各样的功能,如数据处理、网络请求、机器学习等。

使用 pip 安装第三方模块:

pip install requests

-----------------------------------------------------------------------

安装后,我们可以在Python代码中导入并使用第三方模块。例如,使用 requests 模块发送HTTP请求:

import requests

response = ("")
print(response.status_code)  # 输出: 200
print(())       # 输出: GitHub API的响应内容

3、内置模块

内置模块是Python标准库的一部分,这些模块随Python解释器一起发布,默认安装在Python环境中。内置模块涵盖了文件操作、系统调用、数学运算、数据处理等各方面的功能。

我们可以直接导入并使用内置模块。例如,使用 math 模块进行数学运算:

import math

print((16))    # 输出: 4.0
print()          # 输出: 3.141592653589793
print((5))  # 输出: 120

---------------------------------------------------------------------------

os 模块进行操作系统相关操作:

import os

print(())      # 输出当前工作目录
('test_dir')    # 创建目录
print(('.'))  # 列出当前目录下的所有文件和目录

---------------------------------------------------------------------------

sys 模块提供了一些与Python解释器交互的函数和变量。

import sys

print()  # 输出Python版本信息
print()     # 输出模块的搜索路径
()          # 退出Python程序

---------------------------------------------------------------------------

datetime 模块提供了处理日期和时间的类。

import datetime

now = ()
print(now)  # 当前日期和时间

today = ()
print(today)  # 当前日期

one_day = (days=1)
yesterday = today - one_day
print(yesterday)  # 昨天的日期

---------------------------------------------------------------------------

re 模块提供了正则表达式的支持,用于字符串匹配和操作。

import re

pattern = r'\d+'
text = 'There are 123 apples and 456 oranges.'

matches = (pattern, text)
print(matches)  # 输出: ['123', '456']

6、开发规范

一套被称为 PEP 8 的官方编码风格指南,它提供了一系列关于如何编写清晰、易读和一致的Python代码的建议。遵循这些规范可以使你的代码更加容易被他人理解和维护。

1. 缩进
使用4个空格进行缩进。不要使用制表符(tab),因为不同编辑器中制表符的显示宽度不同,会导致代码在不同环境下显示不一致。

# Good
if x > 5:
    print("x is greater than 5")

# Bad - 使用了制表符
if x > 5:
	print("x is greater than 5")

-------------------------------------------------------------------------------------

2. 行长
每行代码建议不超过79个字符,可以有一些例外情况,比如长的导入语句或URL。

# Good
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)


-------------------------------------------------------------------------------------

3. 空行
使用空行来分隔函数和类定义,以及不同功能段落之间的代码块,使代码结构更清晰。

# Good
def function_a():
    # Function body

def function_b():
    # Function body

-------------------------------------------------------------------------------------

4. 注释
使用注释解释代码的目的和关键步骤,使得代码更易于理解。

# Good
# Calculate the sum of two numbers
def add_numbers(a, b):
    return a + b

-------------------------------------------------------------------------------------

5. 命名规范
变量名、函数名使用小写字母,单词间使用下划线 _ 分隔。
类名使用驼峰命名法(首字母大写)。

# Good
def calculate_sum(num_list):
    total_sum = 0
    for num in num_list:
        total_sum += num
    return total_sum

class MyClass:
    def __init__(self, name):
         = name

-------------------------------------------------------------------------------------

6. . 导入规范
每个 import 语句应该单独占一行。
标准库导入放在文件顶部,第三方库导入次之,最后是本地库导入。
不推荐使用通配符导入 (from module import *),除非是导入常用模块,如 from math import *。

# Good
import os
import sys

from datetime import datetime
import requests

7、深浅拷贝

拷贝(copy)是指创建一个新对象,其中包含原始对象的所有内容。

浅拷贝(Shallow Copy)
浅拷贝会创建一个新的对象,然后将原始对象中的元素(如果是可变对象)或者引用(如果是不可变对象)复制到新对象中。新对象与原始对象中的元素是共享的,即修改新对象中的元素也会影响原始对象中的元素。

在Python中,可以使用 copy 模块的 copy() 方法或者对象的 copy() 方法进行浅拷贝。

使用 copy 模块的 copy() 方法进行浅拷贝:

import copy

original_list = [1, 2, [3, 4]]
copied_list = (original_list)

# 修改浅拷贝后的列表
copied_list[2][0] = 100

print(original_list)  # 输出: [1, 2, [100, 4]]
print(copied_list)    # 输出: [1, 2, [100, 4]]

-------------------------------------------------------------------------------------


深拷贝会创建一个新的对象,并递归地将原始对象中的所有元素(包括嵌套对象)复制到新对象中。因此,新对象与原始对象完全独立,修改新对象不会影响原始对象。

在Python中,可以使用 copy 模块的 deepcopy() 方法进行深拷贝。

使用 copy 模块的 deepcopy() 方法进行深拷贝:

import copy

original_list = [1, 2, [3, 4]]
deep_copied_list = (original_list)

# 修改深拷贝后的列表
deep_copied_list[2][0] = 100

print(original_list)    # 输出: [1, 2, [3, 4]]
print(deep_copied_list)  # 输出: [1, 2, [100, 4]]

8、面向对象

面向对象编程(OOP),这是一个强大的编程范式,它将程序视为对象的集合,每个对象都是类的实例。对象是具有属性(数据)和方法(行为)的实体,类是对象的蓝图或模板。

  • 类(Class):类是创建对象的模板。它定义了对象的属性和方法。
  • 对象(Object):对象是类的实例。每个对象都有属于自己的属性和方法。
  • 属性(Attributes):属性是对象的数据,通常用变量表示。
  • 方法(Methods):方法是对象的行为,通常是函数。

1、定义类

class Dog:
    # 类变量
    species = "Canis familiaris"
    
    # 初始化方法(构造函数)
    def __init__(self, name, age):
        # 实例变量
         = name
         = age
    
    # 实例方法
    def description(self):
        return f"{} is {} years old"
    
    # 实例方法
    def speak(self, sound):
        return f"{} says {sound}"


# 创建Dog类的实例
my_dog = Dog("Buddy", 3)

# 访问实例变量和方法
print(my_dog.name)  # 输出: Buddy
print(my_dog.age)   # 输出: 3
print(my_dog.description())  # 输出: Buddy is 3 years old
print(my_dog.speak("Woof Woof"))  # 输出: Buddy says Woof Woof

2、面向对象三大特性

1、封装

封装是指将数据(属性)和行为(方法)包装在一个类中,并通过控制访问来保护数据的完整性。使用双下划线 __ 开头的变量或方法来表示私有(不可访问)。

class Car:
    def __init__(self, model, year):
         = model
        self.__year = year  # 私有变量

    def get_year(self):
        return self.__year  # 通过方法访问私有变量

my_car = Car("Toyota", 2019)
print(my_car.model)       # 输出: Toyota
print(my_car.get_year())  # 输出: 2019
# print(my_car.__year)    # 会引发错误,不能直接访问私有变量

2、继承

继承是面向对象编程中的一个重要概念,它允许一个类继承另一个类的属性和方法,从而实现代码的重用。

# 我这个列子,没有用到父类(upper) 

定义一个基类(父类)

class Animal:
    def __init__(self, name):
         = name

    def speak(self):
        raise NotImplementedError("Subclass must implement abstract method")



定义一个子类

class Dog(Animal):
    def speak(self):
        return f"{} says Woof!"

class Cat(Animal):
    def speak(self):
        return f"{} says Meow!"


使用子类

my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")

print(my_dog.speak())  # 输出: Buddy says Woof!
print(my_cat.speak())  # 输出: Whiskers says Meow!

3、多态

多态是指不同的类可以提供相同的方法或属性接口,即使这些方法的具体实现不同。

def make_animal_speak(animal):
    print(())

make_animal_speak(my_dog)  # 输出: Buddy says Woof!
make_animal_speak(my_cat)  # 输出: Whiskers says Meow!

3、成员

成员用于定义类的属性和行为。

属性(Attributes)
属性是类的数据成员,用于存储对象的状态或特征。在Python中,属性可以分为类属性(类变量)和实例属性(实例变量)两种。

------------------------------------------------------------------------------------

类属性(Class Attributes):属于整个类的变量,所有实例共享。通常在类的内部定义,在所有实例之间保持一致。

class Dog:
    species = "Canis familiaris"  # 类属性

    def __init__(self, name, age):
         = name  # 实例属性
         = age    # 实例属性

-----------------------------------------------------------------------------------

实例属性(Instance Attributes):属于特定实例的变量,每个实例都有独立的值。通常在 __init__ 构造方法中定义。

class Dog:
    def __init__(self, name, age):
         = name  # 实例属性
         = age    # 实例属性
方法(Methods)
方法是类中定义的函数,用于实现类的行为和操作。在Python中,方法分为实例方法、类方法和静态方法三种类型。

-------------------------------------------------------------------------------------

实例方法(Instance Methods):第一个参数通常是 self,表示调用该方法的实例。

class Dog:
    def __init__(self, name):
         = name

    def bark(self):
        return f"{} is barking"

-------------------------------------------------------------------------------------

类方法(Class Methods):使用 @classmethod 装饰器定义,第一个参数通常是 cls,表示调用该方法的类。

class Dog:
    species = "Canis familiaris"

    @classmethod
    def get_species(cls):
        return 

-------------------------------------------------------------------------------------

静态方法(Static Methods):使用 @staticmethod 装饰器定义,不接受特定的实例或类参数,通常用于实现与类相关但又不依赖于类或实例的功能。

class Dog:
    @staticmethod
    def info():
        return "This is a Dog class"
特殊成员
有一些特殊的成员方法(也称为魔术方法或特殊方法),它们的命名以双下划线开头和结尾(例如 __init__)。这些特殊方法提供了一种让对象与Python的内置功能集成的方式,使得对象可以表现得像内置类型一样,比如支持迭代、比较、运算符重载等。

1. __init__: 构造方法,在创建对象时调用,用于初始化对象的状态。

class Dog:
    def __init__(self, name):
         = name

-------------------------------------------------------------------------------------

2. __str__: 字符串表示方法,返回对象的描述字符串,通常用于 print 函数输出。

class Dog:
    def __init__(self, name):
         = name

    def __str__(self):
        return f"Dog: {}"

my_dog = Dog("Buddy")
print(my_dog)  # 输出: Dog: Buddy

-------------------------------------------------------------------------------------

3. __len__: 长度方法,返回对象的长度,通常与内置函数 len() 结合使用。

class MyList:
    def __init__(self, data):
         = data

    def __len__(self):
        return len()

my_list = MyList([1, 2, 3, 4])
print(len(my_list))  # 输出: 4

-------------------------------------------------------------------------------------

4. __getitem__ 和 __setitem__: 索引访问方法,允许对象像序列一样使用索引访问元素。

class MyList:
    def __init__(self, data):
         = data

    def __getitem__(self, index):
        return [index]

    def __setitem__(self, index, value):
        [index] = value

my_list = MyList([1, 2, 3, 4])
print(my_list[2])   # 输出: 3
my_list[2] = 10
print(my_list[2])   # 输出: 10

-------------------------------------------------------------------------------------

5. __iter__ 和 __next__: 迭代方法,允许对象支持迭代器协议,实现迭代访问元素。


class Countdown:
    def __init__(self, start):
         = start

    def __iter__(self):
        return self

    def __next__(self):
        if  <= 0:
            raise StopIteration
        result = 
         -= 1
        return result

countdown = Countdown(5)
for num in countdown:
    print(num)  # 逐行输出: 5, 4, 3, 2, 1

4、迭代器、生成器、可迭代对象

1、可迭代对象(Iterable)

可迭代对象是实现了 __iter__ 方法的对象,__iter__ 方法返回一个迭代器。可以用 for 循环来遍历可迭代对象中的元素。

my_list = [1, 2, 3]
for item in my_list:
    print(item)  # 输出: 1, 2, 3

2、迭代器(Iterator)

迭代器是实现了 __iter____next__ 方法的对象。__iter__ 方法返回迭代器本身,__next__ 方法返回下一个元素。如果没有更多的元素可返回,__next__ 方法会引发 StopIteration 异常。

class MyIterator:
    def __init__(self, start, end):
         = start
         = end

    def __iter__(self):
        return self

    def __next__(self):
        if  >= :
            raise StopIteration
        else:
             += 1
            return  - 1

iterator = MyIterator(1, 4)
for item in iterator:
    print(item)  # 输出: 1, 2, 3

3、生成器(Generator)

生成器是一种特殊的迭代器,使用 yield 关键字定义。生成器函数每次被调用时会暂停并保存当前的执行状态(包括局部变量、指令指针等),并返回一个值。下一次调用生成器函数时,会从上次暂停的地方继续执行。

def my_generator(start, end):
    current = start
    while current < end:
        yield current
        current += 1

gen = my_generator(1, 4)
for item in gen:
    print(item)  # 输出: 1, 2, 3

4、关系与区别

  1. 可迭代对象 是实现了 __iter__ 方法的对象。调用 __iter__ 方法返回一个迭代器。
  2. 迭代器 是实现了 __iter____next__ 方法的对象。__next__ 方法返回下一个元素,并在没有更多元素时引发 StopIteration 异常。
  3. 生成器 是一种特殊的迭代器,通过生成器函数和 yield 关键字创建。生成器函数每次调用时会返回一个生成器对象,该对象自动实现了迭代器协议(__iter____next__ 方法)。

5、异常处理

异常处理是一种机制,用于处理程序运行时可能发生的错误或异常情况,例如除零错误、索引错误等。异常处理通过 try-except 语句块来实现。

try:
    result = 10 / 0  # 除零错误
except ZeroDivisionError:
    print("除零错误发生")

--------------------------------------------------------------------------------

try:
    # 可能会抛出异常的代码块
    pass
except ExceptionType1:
    # 如果抛出 ExceptionType1 异常,则执行此处的代码块
    pass
except ExceptionType2 as e:
    # 如果抛出 ExceptionType2 异常,并将异常对象保存到变量 e 中,则执行此处的代码块
    pass
else:
    # 如果没有发生异常,则执行此处的代码块
    pass
finally:
    # 无论是否发生异常,都会执行此处的代码块
    pass

6、反射

射是一种在运行时检查类或对象的能力,并且可以在运行时修改类或对象的能力。在Python中,可以通过内置的函数如 getattr()hasattr()setattr()delattr() 等来实现反射。

class MyClass:
    def __init__(self, x):
         = x

    def my_method(self):
        print("调用了 my_method")

obj = MyClass(10)

# 使用 getattr 获取属性值
print(getattr(obj, 'x'))  # 输出: 10

# 使用 hasattr 检查属性是否存在
print(hasattr(obj, 'my_method'))  # 输出: True

# 使用 setattr 设置属性值
setattr(obj, 'y', 20)
print()  # 输出: 20

# 使用 delattr 删除属性
delattr(obj, 'x')
print(obj.__dict__)  # 输出: {'y': 20}

                                                                                                         写的不好,请多多指教