Python学习笔记 | PHM's world

LOADING

歡迎來到烏托邦的世界

Python学习笔记

Python

[TOC]

一.编程前的准备工作

在命令行(bash)中打开 Python 和运行 Python 文件的步骤如下:

1. 打开 Python 解释器

在命令行中输入以下命令并按回车键:

python

这将启动 Python 解释器,你将看到一个提示符 >>>,表示你可以在这里输入 Python 代码并执行。

2. 运行 Python 文件

在命令提示符(cmd.exe)中,你无需输入 pythonpython3,而是直接输入以下命令:

test.py

确保你的命令提示符的当前工作目录是包含 test.py 文件的目录,或者你可以提供文件的完整路径。这样应该可以成功运行 test.py 文件。

可以使用 cd 命令切换到包含 test.py 文件的目录,然后再运行 test.py。例如:

cd path\to\your\script\directory
test.py

这里的 path\to\your\script\directory 是包含 test.py 文件的目录的路径。

如果你知道 test.py 文件的绝对路径,也可以直接在命令提示符中输入:

path\to\test.py

二.Python的语言基础

1.type()函数:

在交互模式下得到参数的数据类型

2. 乘方 ,幂运算

3.eval()函数:

eval() 函数是一个内置函数,它用于动态地执行字符串表达式,并返回表达式的结果。这个函数接受一个字符串参数,该字符串包含有效的Python表达式,然后执行该表达式并返回结果。

语法:

eval(expression, globals=None, locals=None)
  • expression: 要执行的字符串表达式。
  • globals(可选): 一个字典,用于全局命名空间的变量。如果提供了 globals 参数,那么 eval() 函数将在这个字典的上下文中执行表达式。
  • locals(可选): 一个字典,用于局部命名空间的变量。如果提供了 locals 参数,那么 eval() 函数将在这个字典的上下文中执行表达式。

使用 eval() 的例子:

x = 10
y = 20
result = eval('x + y')
print(result)  # 输出 30

在这个例子中,eval('x + y') 执行了字符串表达式 'x + y',并返回结果 30

需要注意的是,eval() 函数具有潜在的安全风险,因为它允许执行任意的Python代码。如果从不受信任的来源获取字符串并将其传递给 eval(),可能会导致安全问题。因此,应该谨慎使用 eval(),特别是在处理用户输入时。

4.input()函数:

获取用户输入的数据,input() 内可以放双引号””来添加内容。

5.格式化字符串format():

format() 方法是用于格式化字符串的内置方法。它允许你通过将占位符 {} 插入字符串中,并使用 format() 方法提供的参数替换这些占位符。

基本的语法如下:

formatted_string = "Some text with {} and {}".format(value1, value2)

这里的 {} 是占位符,它们会依次被 format() 方法的参数替换。可以有多个占位符,也可以使用序号或关键字来指定替换的值。

例子:

name = "John"
age = 30
# 使用位置参数
formatted_string = "My name is {} and I am {} years old.".format(name, age)
print(formatted_string)
# 输出: My name is John and I am 30 years old.
# 使用序号指定顺序
formatted_string = "{1} is {0} years old.".format(age, name)
print(formatted_string)
# 输出: John is 30 years old.
# 使用关键字参数
formatted_string = "My name is {n} and I am {a} years old.".format(n=name, a=age)
print(formatted_string)
# 输出: My name is John and I am 30 years old.

format() 方法还支持更复杂的格式设置,包括指定字段宽度、精度、填充字符等。以下是一个简单的例子:

pi = 3.1415926535

# 指定小数点后两位
formatted_string = "The value of pi is {:.2f}".format(pi)
print(formatted_string)
# 输出: The value of pi is 3.14

这些只是 format() 方法的一些基础用法,详细的格式化选项可以查阅 Python 官方文档。

6.续行符号\

print("我是一名程序员\
我刚开始学习python")

7.print()函数

for i in range(1, 10):
    for j in range(1, i+1):
        product = i * j
        print(f"{j} * {i} = {product}\t", end="")
    print()

(1)默认换行

在Python中,print() 函数默认在打印完内容之后会添加一个换行符(\n,从而使下一个输出跳到新的一行。这是因为在Python 3中,print() 函数有一个默认的 end 参数,其默认值为 \n,表示在输出结束时要添加的字符串。

例如:

print("Hello")
print("World")

这段代码的输出将是:

Hello
World

如果你想自定义 end 参数,可以在 print() 函数中指定,比如:

print("Hello", end="***")
print("World")

这样的输出将是:

Hello***World

但通常情况下,我们使用 print() 函数时不需要显式指定 end 参数,因为默认的换行符对于大多数情况都是合适的。

(2)格式化输出

在这个语句中,f"{j} * {i} = {product}\t" 使用了 f-string(格式化字符串字面值)。f-string 是在 Python 3.6 版本中引入的一种方便的字符串格式化方式。

在一个 f-string 中,你可以在字符串中嵌入表达式,这些表达式会在运行时被求值,并将结果插入到字符串中。在这里,{j}, {i}, {product} 都是表达式,分别代表变量 jiproduct 的值。\t 表示制表符,用于在输出中产生水平间距。

这样的语法使得字符串的构建更加清晰和简便,而不需要使用传统的字符串连接方式。例子中的 f-string 被用于构建乘法口诀表中每行的输出。

三.小海龟Turtle

1.基本操作

import turtle
turtle.forward(200)
turtle.done() #结束绘制工作
turtle.left(90) #向左旋转90度
turtle.color("red")
#上色:
turtle.color("yellow")
turtle.begin_fill()
turtle.end_fill()
#背景
turtle.bgcolor("black")
#移动开始位置
turtle.up()
turtle.goto(100,100)
turtle.down()

2.循环

for i in range(4): #先记住
    turtle.forward(200)
    turtle.left(90)

四,程序的流程控制

1.基本内容

if else

elif

while

for

2.循环中的else

python中特有,循环中可以有else分支

可以使用while或者for

str = input()
for letter in str:
    print(letter,end = " ")
else:
    print("循环正常结束")
print("程序结束")

五,函数与模块

1.匿名函数

仅包含一条语句,参数可有可无,参数个数任意

s = lambda : "python".upper()
f = lambda x : x*10
print(s())
print(f(10))

2.默认参数与关键字参数

在Python中,函数的参数可以分为两种:默认参数和关键字参数。

  1. 默认参数(Default Parameters):

    默认参数是在定义函数时给参数一个默认值,如果在调用函数时没有传递该参数,则使用默认值。定义默认参数的语法是在函数定义中给参数赋予默认值。

    示例:

    def greet(name, greeting="Hello"):
        print(f"{greeting}, {name}!")
    
    greet("Alice")  # 使用默认值输出:Hello, Alice!
    greet("Bob", "Good morning")  # 使用传递的值输出:Good morning, Bob!
    

    在这个例子中,greeting 参数有一个默认值 “Hello”,如果不提供该参数,将使用默认值。

  2. 关键字参数(Keyword Arguments):

    关键字参数是通过指定参数名进行传递的参数。在函数调用中,通过 parameter_name=value 的形式传递参数,这样可以不按照函数定义时的参数顺序传递。

    示例:

    def display_info(name, age, city):
        print(f"Name: {name}, Age: {age}, City: {city}")
    
    display_info(age=25, name="Alice", city="Wonderland")
    

    在这个例子中,通过关键字参数指定了参数的值,顺序可以与函数定义时不同。

注意事项:

  • 默认参数必须在非默认参数之后定义,例如 def func(param1, param2=default_value):
  • 如果同时使用默认参数和关键字参数,关键字参数必须位于默认参数之后。

3.不定长参数

在Python中,有两种不定长参数的方式:可变位置参数和可变关键字参数。

  1. 可变位置参数(*args):

    可变位置参数允许你传递任意数量的位置参数给函数。在函数定义时,在参数前面加上 * 号,这表示接受任意数量的位置参数,并将它们作为元组传递给函数。

    示例:

    def print_args(*args):
        for arg in args:
            print(arg)
    
    print_args(1, 2, 3, "four")
    

    这个函数接受任意数量的参数,并将它们打印出来。

  2. 可变关键字参数(kwargs):**

    可变关键字参数允许你传递任意数量的关键字参数给函数。在函数定义时,在参数前面加上 ** 号,这表示接受任意数量的关键字参数,并将它们作为字典传递给函数。

    示例:

    def print_kwargs(**kwargs):
        for key, value in kwargs.items():
            print(f"{key}: {value}")
    
    print_kwargs(name="Alice", age=25, city="Wonderland")
    

    这个函数接受任意数量的关键字参数,并将它们打印出来。

使用时,你可以同时使用这两种不定长参数,例如:

def example_function(arg1, *args, kwarg1="default", **kwargs):
    # 函数体
    pass

这个函数可以接受一个位置参数 arg1,任意数量的位置参数 args,一个默认值的关键字参数 kwarg1,和任意数量的关键字参数 kwargs

4.模块化程序设计

(1)基础知识

一个或几个.py相关的函数保存为.py文件,构成一个模块,导入该模块,可以调用模块中定义的函数

在Python中,你可以将几个不同的函数打包为一个模块。以下是一个简单的步骤:

  1. 创建一个新的Python文件: 为你的模块选择一个名称,并创建一个以.py为扩展名的新文件,例如mymodule.py

  2. 在文件中定义函数: 在新文件中,定义你想要包含的函数。例如:

    # mymodule.py
    
    def add_numbers(a, b):
        return a + b
    
    def multiply_numbers(a, b):
        return a * b
    
    def greet(name):
        return f"Hello, {name}!"
    
  3. 保存文件: 保存你的文件。

  4. 在其他Python文件中使用模块: 你可以在其他Python文件中使用你创建的模块。例如,如果你的模块文件和使用模块的文件在同一目录下,可以这样使用:

    # 使用模块的文件
      
    import mymodule
      
    result = mymodule.add_numbers(3, 4)
    print(result)
      
    greeting = mymodule.greet("John")
    print(greeting)
    

    如果模块文件不在同一目录下,你可以将模块文件所在的路径添加到Python解释器的搜索路径中,或者使用相对路径导入模块。

通过这种方式,你可以将多个函数组织在一个模块中,使代码更易于管理和维护。

如果模块文件不在同一目录下,你可以使用以下方法导入模块:

假设有以下目录结构:

project/
|-- modules/
|   |-- mymodule.py
|-- main.py
  1. 添加模块所在路径到sys.path:

    main.py文件中,你可以使用sys.path添加模块所在的路径。确保你的main.py文件中包含以下代码:

    # main.py
    
    import sys
    sys.path.append("path/to/modules")
    
    import mymodule
    
    result = mymodule.add_numbers(3, 4)
    print(result)
    
    greeting = mymodule.greet("John")
    print(greeting)
    

    "path/to/modules"替换为mymodule.py所在的实际路径。

  2. 使用相对路径导入:

    如果main.pymymodule.py在相对位置上有固定的相对路径,你可以使用相对导入。例如,如果main.pymymodule.py在同一目录下,可以这样导入:

    # main.py
    
    from modules import mymodule
    
    result = mymodule.add_numbers(3, 4)
    print(result)
    
    greeting = mymodule.greet("John")
    print(greeting)
    

    如果main.pyproject目录下,你可以使用from modules import mymodule

选择适合你项目结构的方法,并确保你正确引入了模块。

(2)模块及其引用

在Python中,有几种不同的模块引用方法,具体取决于模块的位置和你希望如何引用它。以下是一些常见的模块引用方法:

  1. 绝对路径引用:

    如果模块在Python解释器的搜索路径中,你可以使用绝对路径引用。这是最基本的引用方式。

    # 使用绝对路径引用
    import mymodule
    
  2. 相对路径引用:

    如果你的模块和使用它的脚本在相同目录下或有固定的相对路径关系,可以使用相对路径引用。

    # 使用相对路径引用
    from . import mymodule  # 当脚本和模块在同一目录下
    
  3. 添加路径到sys.path:

    通过将模块所在路径添加到sys.path,你可以使用绝对或相对引用。

    # 添加路径到sys.path
    import sys
    sys.path.append("path/to/modules")
    
    import mymodule
    
  4. 包引用:

    如果你的模块在一个包(目录)中,你可以使用包引用。

    # 包引用
    from mypackage import mymodule
    

    这假设mymodulemypackage包中的一个模块。

  5. 别名引用:

    你还可以为模块使用别名,使代码更简洁。

    # 使用别名引用
    import mymodule as mm
    

    然后,你可以使用 mm 来代替 mymodule

选择适合你项目结构和需求的引用方法,并确保你的模块路径正确。

在Python中,sys.path是一个包含用于查找模块的目录路径的列表。这个列表由解释器在启动时设置,它包括了以下几个元素:

  1. 当前工作目录(Current Working Directory)。
  2. PYTHONPATH 环境变量中指定的目录。
  3. 内置模块的默认路径。
  4. 在安装 Python 时配置的默认路径。

sys.path中的目录路径按照它们在列表中的顺序进行搜索。当你导入一个模块时,Python 解释器会按照这个路径列表的顺序在这些目录中查找相应的模块文件。

你可以通过在代码中修改 sys.path 来添加或删除目录路径,以影响模块的搜索路径。例如,你可以使用 sys.path.append("path/to/directory") 将目录添加到搜索路径中。

以下是一个简单的示例,演示了 sys.path 的基本用法:

import sys

# 输出当前 sys.path
print("Current sys.path:", sys.path)

# 添加一个目录到 sys.path
sys.path.append("/path/to/custom/directory")

# 再次输出 sys.path
print("Updated sys.path:", sys.path)

通过了解 sys.path,你可以更好地理解 Python 解释器在哪里查找模块文件。这对于处理模块的导入和路径问题非常有用。

(3)包

在Python中,包(Package)是一种将模块组织在一起的方式,以便更好地管理和组织代码。包本质上是一个包含了特殊文件 __init__.py 的目录,该目录下可以包含其他模块或子包。

以下是创建和引用Python包的基本步骤:

建立包:

  1. 创建包目录: 创建一个目录,该目录将作为包的顶级目录。

    mypackage/
    
  2. 在包目录中添加 __init__.py 文件: 添加一个空的 __init__.py 文件,它会告诉Python这个目录应该被视为一个包。

    mypackage/
    ├── __init__.py
    
  3. 在包中添加模块文件: 在包目录中添加模块文件,可以是以.py为扩展名的Python文件。

    mypackage/
    ├── __init__.py
    ├── module1.py
    ├── module2.py
    
    # module1.py
    def function1():
        print("Function 1 in module1")
    
    # module2.py
    def function2():
        print("Function 2 in module2")
    

引用包中的模块:

  1. 绝对路径引用: 使用绝对路径引用包中的模块。

    # main.py
    from mypackage import module1, module2
    
    module1.function1()
    module2.function2()
    
  2. 相对路径引用: 在包内的模块之间进行相对路径引用。

    # module1.py
    from .module2 import function2
    
    def function1():
        print("Function 1 in module1")
        function2()
    
  3. 导入整个包: 你也可以导入整个包,然后使用点符号访问模块。

    # main.py
    import mypackage
    
    mypackage.module1.function1()
    mypackage.module2.function2()
    

通过这些步骤,你可以创建和引用Python包,从而更好地组织和管理你的代码。

(4)内置函数

Python 3中有许多内置函数,这些函数不需要导入任何模块即可使用。以下是一些常用的Python 3内置函数:

  1. 类型转换函数:

    • int(x [, base]): 将x转换为一个整数。base 参数指定 x 中的数字是什么进制,默认是十进制。
    • float(x): 将 x 转换为一个浮点数。
    • str(x): 将对象 x 转换为字符串。
  2. 序列操作函数:

    • len(sequence): 返回序列的长度。
    • max(iterable, *[, key, default]): 返回可迭代对象中的最大值。
    • min(iterable, *[, key, default]): 返回可迭代对象中的最小值.
    • sum(iterable, /, start=0): 返回可迭代对象中所有元素的总和。
  3. 迭代器和生成器函数:

    • iter(object[, sentinel]): 返回一个迭代器对象。
    • next(iterator[, default]): 从迭代器中获取下一个元素。
    • range(stop), range(start, stop[, step]): 创建一个范围内的数字序列。
  4. 其他常用函数:

    • print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False): 打印输出。
    • input([prompt]): 从用户获取输入。
    • type(object): 返回对象的类型。
    • len(object): 返回对象的长度。
  5. 数学函数:

    • abs(x): 返回 x 的绝对值。
    • pow(x, y[, z]): 返回 x 的 y 次方,如果给定 z 参数,返回 x 的 y 次方与 z 取模的结果。

以上仅是一小部分Python 3内置函数,实际上Python提供了很多有用的内置函数。你可以查阅官方文档或使用 help() 函数来获取更多关于内置函数的信息。

六,数据结构

1.元组

就是只读列表

用()来表示

在Python中,元组是不可变的数据结构,这意味着一旦创建,就不能对其进行修改。因此,删除元组的操作实际上是删除整个元组对象的引用。你不能删除元组中的单个元素,但可以删除整个元组变量。

删除整个元组变量:

使用 del 关键字可以删除整个元组变量。

my_tuple = (1, 2, 3, 4, 5)

# 删除整个元组变量
del my_tuple

# 尝试访问已删除的元组会引发异常
# print(my_tuple)  # 这行代码会引发 NameError

在上述示例中,del my_tuple 删除了整个元组对象。

删除元组中的元素(不可行):

由于元组是不可变的,不能删除元组中的单个元素。如果需要删除某个元素,你可能需要考虑使用其他数据结构,如列表(list)。

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

# 删除列表中的元素
del my_list[2]

print(my_list)  # 输出: [1, 2, 4, 5]

总的来说,元组是不可变的,因此不能直接删除其中的元素。你只能删除整个元组变量。如果你需要对元素进行增删操作,可能需要使用列表等可变的数据结构。

2.列表

列表中可以存放多个元素的值,可以修改或者删除

在Python中,列表(List)是一种可变的数据结构,允许你在创建后对其进行修改。以下是一些常用的列表数据操作方法:

创建列表:

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

访问元素:

# 访问单个元素
first_element = my_list[0]

# 访问多个元素(切片)
subset = my_list[1:4]  # 包含索引 1、2、3的元素

修改元素:

# 修改单个元素
my_list[2] = 10

# 修改多个元素(切片赋值)
my_list[1:4] = [20, 30, 40]

添加元素:

# 在末尾添加一个元素
my_list.append(6)

# 在指定位置插入一个元素
my_list.insert(2, 15)

删除元素:

# 删除指定位置的元素
del my_list[2]

# 删除指定值的第一个匹配项
my_list.remove(30)

# 弹出(删除并返回)指定位置的元素
popped_element = my_list.pop(1)

查找元素:

# 查找元素的索引
index = my_list.index(4)

其他常用方法:

# 获取列表长度
length = len(my_list)

# 排序列表(原地排序)
my_list.sort()

# 反向排序列表(原地操作)
my_list.reverse()

# 复制列表
copy_of_list = my_list.copy()

# 清空列表
my_list.clear()

以上是一些基本的列表数据操作方法。列表提供了很多灵活的操作,使得对数据的处理变得非常方便。

列表中的pop操作默认删除列表的最后一个元素

number = [1,2,3]
number.pop()

remove方法移除列表中的某个元素的第一个匹配项

char.remove("d")

3.字符串

字符串的截取

var = "hello"
var[0]
#得到的结果是h

连接字符串

var1 = 'hello'
var2 = 'python'
var1 = var1 + var2
print(var1)
#hellopython

格式化字符串

在Python中,格式化字符串是一种方便的方法,用于创建包含变量或表达式值的字符串。主要有以下几种方式:

  1. 百分比(%)格式化:这是一种较早的格式化方式。它使用 % 操作符和一个格式字符串。

    name = "Alice"
    age = 30
    formatted_string = "Hello, %s. You are %d years old." % (name, age)
    
  2. str.format() 方法:这是一种更现代的格式化方法,提供了更多的灵活性。

    name = "Alice"
    age = 30
    formatted_string = "Hello, {}. You are {} years old.".format(name, age)
    

    你也可以使用索引或关键字来更明确地指定格式化值的位置:

    formatted_string = "Hello, {1}. You are {0} years old.".format(age, name)
    
  3. f-字符串(自Python 3.6起可用):这是最新且通常最推荐的格式化方法。它非常直观和易读。

    name = "Alice"
    age = 30
    formatted_string = f"Hello, {name}. You are {age} years old."
    

在这些方法中,f-字符串因其简洁和直观而成为许多Python开发者的首选。它允许直接在字符串中插入变量和表达式。

字符串的操作方法

在Python中,find()join() 是字符串操作的两个常用方法。

  1. find() 方法:

    • find() 方法用于在字符串中查找子字符串,并返回第一个匹配的位置。如果找不到匹配的子字符串,则返回 -1。
    • 语法:str.find(sub[, start[, end]])
      • sub 是要查找的子字符串。
      • start 是可选参数,指定开始查找的位置,默认为 0。
      • end 是可选参数,指定结束查找的位置,默认为字符串的长度。

    示例:

    sentence = "Hello, how are you?"
    position = sentence.find("how")
    print(position)  # 输出: 7
    
  2. join() 方法:

    • join() 方法用于将序列中的元素以指定的字符串连接生成一个新的字符串。
    • 语法:str.join(iterable)
      • str 是连接的字符串。
      • iterable 是一个可迭代对象,如列表、元组等。

    示例:

    words = ["Hello", "world", "!"]
    result = " ".join(words)
    print(result)  # 输出: Hello world !
    

这两个方法在处理字符串时非常实用。find() 用于查找子字符串的位置,而 join() 用于将多个字符串连接在一起。

在Python中,split()strip() 是两个用于字符串操作的常用方法。

  1. split() 方法:

    • split() 方法用于将字符串分割成一个列表,通过指定分隔符。默认情况下,它使用空格作为分隔符。
    • 语法:str.split([sep[, maxsplit]])
      • sep 是可选参数,指定分隔符,默认为空格。
      • maxsplit 是可选参数,指定分割的最大次数。

    示例:

    sentence = "Hello, how are you?"
    words = sentence.split()  # 默认以空格分割
    print(words)  # 输出: ['Hello,', 'how', 'are', 'you?']
    

    也可以指定其他分隔符:

    data = "apple,orange,banana"
    fruits = data.split(',')
    print(fruits)  # 输出: ['apple', 'orange', 'banana']
    
  2. strip() 方法:

    • strip() 方法用于去除字符串两端的空白字符(包括空格、制表符和换行符)。
    • 语法:str.strip([chars])
      • chars 是可选参数,指定要去除的字符,默认为去除空白字符。

    示例:

    text = "   This is a sentence.   "
    stripped_text = text.strip()
    print(stripped_text)  # 输出: 'This is a sentence.'
    

    也可以指定要去除的特定字符:

    text = "!!!This is important!!!"
    stripped_text = text.strip('!')
    print(stripped_text)  # 输出: 'This is important'
    

这两个方法在字符串处理中非常有用,split() 用于拆分字符串,而 strip() 用于去除字符串两端的空白字符或指定字符。

lower() upper()方法

小写/大写字母

in方法

var = 'hee'
'e' in var
#返回true

4.字典

是python中的唯一映射类型

在Python中,字典(Dictionary)是一种无序、可变的数据类型,用于存储键-值对。以下是字典的创建和访问字典中的值的方法:

  1. 字典的创建:

    • 使用花括号 {} 创建字典,其中每个键值对用冒号 : 分隔,键和值之间用逗号 , 分隔。

    • 例如:

      my_dict = {"name": "John", "age": 30, "city": "New York"}
      
    • 通过 dict() 构造函数也可以创建字典:

      another_dict = dict(name="Alice", age=25, city="London")
      
  2. 访问字典中的值:

    • 使用键来访问字典中的值。通过指定键,可以获取相应的值。

    • 例如:

      print(my_dict["name"])  # 输出: John
      print(another_dict["age"])  # 输出: 25
      
    • 使用 get() 方法也可以访问值,如果键不存在,不会引发错误,而是返回一个默认值(默认为 None):

      print(my_dict.get("city"))  # 输出: New York
      print(my_dict.get("gender", "Not specified"))  # 输出: Not specified (因为 "gender" 不存在)
      
    • 使用 keys() 方法可以获取所有的键,而 values() 方法可以获取所有的值:

      keys = my_dict.keys()
      values = my_dict.values()
      print(keys)  # 输出: dict_keys(['name', 'age', 'city'])
      print(values)  # 输出: dict_values(['John', 30, 'New York'])
      

这些方法使得字典在存储和检索键值对时非常方便。字典中的键是唯一的,而值可以是任何数据类型。

在Python中,可以使用不同的方法来修改字典中的数据,包括添加新的键值对、更新现有的键值对以及删除键值对。

  1. 添加新的键值对:

    • 可以通过指定新的键和相应的值,向字典中添加新的键值对。
    my_dict = {"name": "John", "age": 30, "city": "New York"}
    
    # 添加新的键值对
    my_dict["gender"] = "Male"
    print(my_dict)
    # 输出: {'name': 'John', 'age': 30, 'city': 'New York', 'gender': 'Male'}
    
  2. 更新现有的键值对:

    • 可以通过指定已有的键来更新对应的值。
    my_dict = {"name": "John", "age": 30, "city": "New York"}
    
    # 更新现有的键值对
    my_dict["age"] = 31
    print(my_dict)
    # 输出: {'name': 'John', 'age': 31, 'city': 'New York'}
    
    • 使用 update() 方法也可以一次性更新多个键值对。
    my_dict.update({"age": 32, "country": "USA"})
    print(my_dict)
    # 输出: {'name': 'John', 'age': 32, 'city': 'New York', 'country': 'USA'}
    
  3. 删除键值对:

    • 使用 del 关键字可以删除指定的键值对。
    my_dict = {"name": "John", "age": 30, "city": "New York"}
    
    # 删除键值对
    del my_dict["age"]
    print(my_dict)
    # 输出: {'name': 'John', 'city': 'New York'}
    
    • 使用 pop() 方法也可以删除指定键的键值对,并返回被删除的值。
    removed_value = my_dict.pop("city")
    print(my_dict)
    # 输出: {'name': 'John'}
    print(removed_value)
    # 输出: New York
    

这些操作使得字典成为一个灵活的数据结构,可以动态地修改和管理数据。

字典的操作方法

字典是Python中的一种数据结构,它提供了许多有用的方法和操作,使得对键值对的管理更加方便。以下是一些常见的字典操作方法:

  1. 获取字典中的值:

    • 使用键来获取字典中对应的值。

      my_dict = {"name": "John", "age": 30, "city": "New York"}
      print(my_dict["name"])  # 输出: John
      
    • 使用 get() 方法也可以获取值,并提供默认值以避免键不存在的错误。

      print(my_dict.get("country", "Not specified"))  # 输出: Not specified
      
  2. 添加新的键值对:

    • 使用赋值语句,通过指定新的键和相应的值,向字典中添加新的键值对。

      my_dict["gender"] = "Male"
      
    • 使用 update() 方法一次性添加多个键值对。

      my_dict.update({"occupation": "Engineer", "salary": 50000})
      
  3. 更新现有的键值对:

    • 通过指定已有的键,更新对应的值。

      my_dict["age"] = 31
      
    • 使用 update() 方法也可以一次性更新多个键值对。

      my_dict.update({"age": 32, "country": "USA"})
      
  4. 删除键值对:

    • 使用 del 关键字删除指定的键值对。

      del my_dict["age"]
      
    • 使用 pop() 方法删除指定键的键值对,并返回被删除的值。

      removed_value = my_dict.pop("city")
      
    • 使用 popitem() 方法删除并返回字典中的最后一个键值对。

      last_item = my_dict.popitem()
      
  5. 获取所有键、所有值、所有键值对:

    • 使用 keys() 方法获取所有的键。

      keys = my_dict.keys()
      
    • 使用 values() 方法获取所有的值。

      values = my_dict.values()
      
    • 使用 items() 方法获取所有的键值对。

      items = my_dict.items()
      

    这些方法返回的结果是视图对象,可以将其转换为列表或其他数据类型以方便使用。

  6. 清空字典:

    • 使用 clear() 方法清空字典中所有的键值对。

      my_dict.clear()
      

这些操作方法使得字典在实际应用中非常灵活,能够方便地进行添加、更新、删除和查询操作。

深复制(deep copy)和浅复制(shallow copy)是在Python中用于复制对象的两种不同方式。它们的主要区别在于复制的对象内部包含的子对象是否也被复制。

  1. 浅复制(Shallow Copy):

    • 浅复制创建一个新的对象,然后将原始对象中的元素(如列表、字典等)复制到新对象中。但是,对于原始对象中的子对象(如子列表、嵌套字典等),仅复制引用而不复制实际的子对象。

    • 在Python中,可以使用 copy() 方法或 copy 模块中的 copy() 函数进行浅复制。

      import copy
      
      original_list = [1, [2, 3], 4]
      shallow_copy_list = copy.copy(original_list)
      
      print(original_list)         # 输出: [1, [2, 3], 4]
      print(shallow_copy_list)     # 输出: [1, [2, 3], 4]
      
      # 修改原始列表中的元素
      original_list[1][0] = 99
      
      print(original_list)         # 输出: [1, [99, 3], 4]
      print(shallow_copy_list)     # 输出: [1, [99, 3], 4](子列表被共享)
      
    • 注意:浅复制只复制了对象本身以及对象中的元素,而没有递归地复制子对象。

  2. 深复制(Deep Copy):

    • 深复制创建一个新的对象,并递归地复制原始对象中的所有元素,包括子对象。

    • 在Python中,可以使用 copy 模块中的 deepcopy() 函数进行深复制。

      import copy
      
      original_list = [1, [2, 3], 4]
      deep_copy_list = copy.deepcopy(original_list)
      
      print(original_list)         # 输出: [1, [2, 3], 4]
      print(deep_copy_list)        # 输出: [1, [2, 3], 4]
      
      # 修改原始列表中的元素
      original_list[1][0] = 99
      
      print(original_list)         # 输出: [1, [99, 3], 4]
      print(deep_copy_list)        # 输出: [1, [2, 3], 4](子列表不被共享)
      
    • 深复制会递归地复制整个对象结构,包括对象中的所有子对象,因此即使修改了原始对象的子对象,深复制的对象也不受影响。

选择使用浅复制还是深复制取决于应用的需求。如果对象中没有嵌套的可变对象或者不需要对嵌套的可变对象进行独立修改,那么浅复制可能足够。如果对象包含嵌套的可变对象,而且需要独立修改它们,那么深复制更合适。

5.集合

用set()函数来创建集合

删除:remove()

添加:add()

拆分传入:update()

a = set('i love')
a.update('python')
#{'i', ' ', 'l', 'o', 'v', 'e', 'p', 'y', 't', 'h', 'n'}

集合可以做数学操作

七,异常的处理和文件操作

1.异常处理

在Python中,异常处理是一种机制,用于捕获和处理程序执行中可能发生的异常或错误。Python提供了tryexcept块来实现异常处理。以下是基本的异常处理结构:

try:
    # 代码块,可能会引发异常的部分
    # ...
except ExceptionType as e:
    # 异常处理块,处理发生的特定类型的异常
    # ...
else:
    # 可选的 else 块,在没有异常发生时执行
    # ...
finally:
    # 可选的 finally 块,无论是否发生异常都会执行
    # ...
  • try 块包含可能引发异常的代码。
  • except 块用于捕获并处理指定类型的异常。可以捕获多个异常类型,也可以省略异常类型捕获所有异常。
  • else 块(可选)在没有异常发生时执行。
  • finally 块(可选)无论是否发生异常都会执行,通常用于进行清理操作。

示例:

try:
    x = 10 / 0  # 除零错误
except ZeroDivisionError as e:
    print(f"Error: {e}")
else:
    print("No error occurred.")
finally:
    print("This will always execute.")

在上面的例子中,由于除零错误,控制流将跳转到except块,并输出错误信息。然后,finally块中的语句总是执行。

除了基本的tryexcept,还有其他一些关键字和语句,例如raise(用于手动引发异常)和assert(用于断言条件是否为真)。异常处理是编写健壮和容错代码的重要部分。

2.文件操作

在Python中,文件操作是常见的任务之一,用于读取和写入文件。以下是一些常用的文件操作方法:

  1. 打开文件:
    使用 open() 函数来打开文件。该函数返回一个文件对象,可以用于读取或写入文件。

    # 打开文件以供读取
    file = open("example.txt", "r")
    
    # 打开文件以供写入(若文件不存在则创建)
    file = open("example.txt", "w")
    

    参数:

    • 第一个参数是文件路径。
    • 第二个参数是打开文件的模式:
      • "r": 只读模式
      • "w": 写入模式(若文件存在则清空内容,若文件不存在则创建)
      • "a": 追加模式(在文件末尾追加内容,若文件不存在则创建)
  2. 读取文件内容:
    使用文件对象的 read() 方法来读取文件内容。

    content = file.read()
    print(content)
    
  3. 写入文件内容:
    使用文件对象的 write() 方法来写入内容到文件。

    file.write("Hello, this is a sample text.")
    

    要确保写入后使用 close() 方法关闭文件,或者使用 with 语句来自动关闭文件。

    with open("example.txt", "w") as file:
        file.write("Hello, this is a sample text.")
    
  4. 逐行读取文件:
    使用文件对象的 readline() 方法来逐行读取文件内容。

    with open("example.txt", "r") as file:
        line = file.readline()
        while line:
            print(line)
            line = file.readline()
    
  5. 迭代文件对象:
    文件对象本身就是可迭代的,可以直接在 for 循环中使用。

    with open("example.txt", "r") as file:
        for line in file:
            print(line)
    
  6. 关闭文件:
    使用文件对象的 close() 方法来关闭文件。

    file.close()
    

    或者使用 with 语句,它会在代码块执行完毕后自动关闭文件。

    with open("example.txt", "r") as file:
        content = file.read()
        # 文件在这里自动关闭
    

以上是文件的基本读取和写入操作。在实际应用中,还可以使用异常处理来处理文件操作可能引发的异常,例如文件不存在、权限错误等。

replace函数:

在Python中,replace() 是字符串对象的方法之一,用于替换字符串中的指定子串。这个方法的基本语法如下:

str.replace(old, new[, count])
  • old: 要被替换的子串。
  • new: 替换后的新子串。
  • count (可选): 指定替换的次数。如果提供了 count 参数,则只替换前 count 次出现的子串。

下面是一个简单的例子:

sentence = "I love programming. Programming is fun."

# 将 "Programming" 替换为 "Coding"
new_sentence = sentence.replace("Programming", "Coding")

print(new_sentence)
# 输出: "I love coding. Coding is fun."

在上面的例子中,replace() 方法将字符串中所有的 “Programming” 替换为 “Coding”。

需要注意的是,replace() 方法返回一个新的字符串,原始字符串并没有被修改。如果需要修改原始字符串,可以将结果赋值给原始字符串变量。

sentence = "I love programming. Programming is fun."

# 修改原始字符串
sentence = sentence.replace("Programming", "Coding")

print(sentence)
# 输出: "I love coding. Coding is fun."

这个方法在文本处理、字符串清理等场景中很常见。

3.with语句

with 语句是 Python 中用于简化资源管理的一种语法结构。它通常用于对文件、网络连接、数据库连接等需要手动管理的资源进行操作,以确保在离开代码块时资源被正确释放。with 语句的一般形式如下:

with expression as variable:
    # 代码块,对资源进行操作
    # 在退出代码块时,确保资源被正确释放

expression 是一个返回上下文管理器对象的表达式,它定义了资源的进入和退出时的操作。variable 是一个变量名,用于引用上下文管理器对象。

最常见的用法是在文件操作中,例如打开文件:

with open("example.txt", "r") as file:
    content = file.read()
    # 在这里文件已经被打开
    # 在离开这个代码块时,文件会被自动关闭,不需要显式调用 file.close()

在上述例子中,open("example.txt", "r") 返回一个文件对象,这个文件对象是一个上下文管理器,负责在进入和退出代码块时执行相应的操作。在 with 语句的代码块中,可以使用文件对象进行读取或写入操作,而在退出代码块时,文件会被自动关闭,无论代码块中是否发生异常。

用as关键字来取代原来的赋值语句

with 语句的好处包括:

  1. 资源自动管理: 确保在代码块执行完毕后,资源会被正确释放,不需要手动调用释放资源的方法。

  2. 异常处理: 在代码块中发生异常时,with 语句会确保退出时正确处理异常,避免资源泄漏。

  3. 代码简洁: 避免了繁琐的 try-except-finally 结构,使代码更加简洁易读。

with 语句在处理一些需要管理上下文的场景中非常有用,例如文件操作、数据库连接等。

八,面向对象编程

1.类的定义与实例化

在Python中,构造方法是类的特殊方法,用于初始化对象的属性。构造方法的名称是固定的,它应该被命名为 __init__。构造方法的格式和要求如下:

class ClassName:
    def __init__(self, parameter1, parameter2, ...):
        # 构造方法的实现
        self.attribute1 = parameter1
        self.attribute2 = parameter2
        # ...

要点说明:

  1. 方法名称: 构造方法的名称必须是 __init__

  2. 参数 self 构造方法的第一个参数必须是 self,它代表创建的对象实例。在方法内部,通过 self 可以访问该对象的属性和其他方法。

  3. 其他参数: 构造方法可以包含除 self 之外的其他参数,用来接收创建对象时传递的初始值。这些参数通常用于初始化对象的属性。

  4. 属性初始化: 在构造方法中,可以通过 self 来初始化对象的属性。例如,self.attribute1 = parameter1 将构造方法中传入的 parameter1 赋值给对象的属性 attribute1

示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建一个 Person 对象
person1 = Person("Alice", 25)

# 访问对象的属性
print(person1.name)  # 输出: Alice
print(person1.age)   # 输出: 25

这是一个简单的构造方法的例子,演示了如何通过构造方法初始化对象的属性。构造方法在创建对象时自动调用,用于确保对象在被使用之前被正确初始化。

2.类的完整定义

在Python中,一个类的完整定义包括类的名称、类的属性(成员变量)、类的方法(成员方法)以及可能的构造方法。下面是一个简单的类的完整定义示例:

class MyClass:
    # 类的属性
    class_variable = "I am a class variable"

    # 构造方法
    def __init__(self, param1, param2):
        self.instance_variable1 = param1
        self.instance_variable2 = param2

    # 类的方法
    def instance_method(self):
        print("I am an instance method.")

    @classmethod
    def class_method(cls):
        print("I am a class method. Class variable:", cls.class_variable)

    @staticmethod
    def static_method():
        print("I am a static method.")

# 创建一个对象实例
obj = MyClass("value1", "value2")

# 访问对象的属性和调用方法
print(obj.instance_variable1)   # 输出: value1
obj.instance_method()            # 输出: I am an instance method.

# 访问类的属性和调用类方法
print(MyClass.class_variable)    # 输出: I am a class variable
MyClass.class_method()           # 输出: I am a class method. Class variable: I am a class variable

# 调用静态方法
MyClass.static_method()          # 输出: I am a static method.

上述代码中,MyClass 是一个简单的类,它包含了类的属性 class_variable、构造方法 __init__、实例方法 instance_method、类方法 class_method 和静态方法 static_method。在创建类的对象实例后,可以通过对象实例访问属性和调用方法,也可以通过类名访问类的属性和调用类方法。

3.对象属性的默认值设置

在Python中,可以在类的构造方法中为对象属性设置默认值。这可以通过在构造方法中为参数提供默认值来实现。如果创建对象时没有提供特定属性的值,则使用默认值。

以下是一个示例,演示如何在构造方法中设置对象属性的默认值:

class Person:
    def __init__(self, name="Unknown", age=0):
        # 设置对象属性的默认值
        self.name = name
        self.age = age

# 创建对象实例,不提供任何参数,使用默认值
person1 = Person()

# 创建对象实例,提供部分参数,使用默认值
person2 = Person(name="Alice")

# 创建对象实例,提供所有参数,不使用默认值
person3 = Person(name="Bob", age=30)

# 打印对象属性
print(person1.name, person1.age)  # 输出: Unknown 0
print(person2.name, person2.age)  # 输出: Alice 0
print(person3.name, person3.age)  # 输出: Bob 30

在上述示例中,Person 类的构造方法中有两个参数 nameage,并为它们设置了默认值。当创建对象实例时,如果没有提供这两个参数,则会使用默认值。如果提供了参数,则使用提供的值。

这种方式使得对象的创建更加灵活,可以根据需要提供或者不提供特定属性的值。

4.私有属性

在Python中,可以使用双下划线 (__) 或者单下划线(’_’)前缀来定义私有属性和私有方法。私有属性和私有方法只能在类的内部访问,外部无法直接访问它们。这有助于封装类的内部实现细节,防止外部直接修改或调用。

私有属性:

在类中定义私有属性的格式是在属性名称前加上双下划线 (__)。例如:

class MyClass:
    def __init__(self):
        # 定义私有属性
        self.__private_attribute = 42

    def get_private_attribute(self):
        # 在类的方法中访问私有属性
        return self.__private_attribute

# 创建对象实例
obj = MyClass()

# 无法直接访问私有属性,会引发 AttributeError
# print(obj.__private_attribute)

# 通过类的方法访问私有属性
print(obj.get_private_attribute())  # 输出: 42

私有方法:

在类中定义私有方法的格式也是在方法名称前加上双下划线 (__)。例如:

class MyClass:
    def __init__(self):
        pass

    # 定义私有方法
    def __private_method(self):
        return "This is a private method."

    def public_method(self):
        # 在类的方法中调用私有方法
        result = self.__private_method()
        return result

# 创建对象实例
obj = MyClass()

# 无法直接调用私有方法,会引发 AttributeError
# obj.__private_method()

# 通过类的公有方法调用私有方法
print(obj.public_method())  # 输出: This is a private method.

在上述例子中,私有属性和私有方法只能通过类的内部方法进行访问或调用。外部无法直接访问私有属性或调用私有方法。这有助于保护类的内部实现,并提高代码的封装性。

5.类属性

类属性就是定义在类中的一个属性,是必须通过类名访问的属性,类的所有实例共享类属性

6.类的继承

(1). 类的继承:

在Python中,可以通过继承来创建一个新的类,新类称为子类,继承的类称为父类。子类可以继承父类的属性和方法,也可以添加自己的属性和方法。继承的基本语法如下:

class ParentClass:
    # 父类的属性和方法

class ChildClass(ParentClass):
    # 子类的属性和方法

(2). 子类方法对父类方法的覆盖:

子类可以对父类的方法进行覆盖(重写),即在子类中定义与父类同名的方法。这样,当对象是子类的实例时,调用同名方法时将使用子类的方法而不是父类的方法。示例:

class ParentClass:
    def show_message(self):
        print("This is the parent class.")

class ChildClass(ParentClass):
    def show_message(self):
        print("This is the child class.")

# 创建子类对象
child_obj = ChildClass()

# 调用覆盖的方法
child_obj.show_message()  # 输出: This is the child class.

(3). 在子类方法中调用父类的同名方法:

如果在子类的方法中要调用父类的同名方法,可以使用 super() 函数。super() 返回父类的临时对象,可以调用父类的方法。示例:

class ParentClass:
    def show_message(self):
        print("This is the parent class.")

class ChildClass(ParentClass):
    def show_message(self):
        # 调用父类的同名方法
        super().show_message()
        print("This is the child class.")

# 创建子类对象
child_obj = ChildClass()

# 调用子类的方法
child_obj.show_message()

在上述例子中,super().show_message() 调用了父类的 show_message 方法,然后在子类的方法中添加了额外的输出。这样可以保留父类方法的功能,并在子类方法中进行扩展。

九,图形的用户界面

Tkinter是python的默认GUI库

1.创建

在Python中,可以使用tkinter库创建GUI(图形用户界面)应用程序。下面是一个简单的例子,演示如何创建并运行一个基本的Tkinter GUI窗口:

TK()是tkinter库中的构造方法

import tkinter as tk

class SimpleGUI:
    def __init__(self, master):
        self.master = master
        master.title("Simple GUI")

        self.label = tk.Label(master, text="Hello, Tkinter!")
        self.label.pack()

        self.button = tk.Button(master, text="Click Me", command=self.on_button_click)
        self.button.pack()

    def on_button_click(self):
        self.label.config(text="Button Clicked!")

# 创建主窗口
root = tk.Tk()

# 创建并运行GUI
app = SimpleGUI(root)

# 运行主循环
root.mainloop()

[^关于创建两次对象]: 在这两句代码中,root = tk.Tk() 创建了一个 Tkinter 主窗口对象,而 app = SimpleGUI(root) 创建了一个 SimpleGUI 类的对象,并将刚刚创建的 Tkinter 主窗口对象传递给它作为参数。执行的顺序通常是按照代码的顺序进行的,因此在这里,确实是先创建了 Tkinter 主窗口对象,然后创建了 SimpleGUI 类的对象。这种顺序通常是符合逻辑的,因为在创建 SimpleGUI 对象时,你可能需要传递主窗口对象,并在构造方法中进行一些初始化工作。如果反过来,先创建 SimpleGUI 对象,而构造方法又需要主窗口对象作为参数,那么你就需要确保在创建 SimpleGUI 对象之前已经有了主窗口对象。所以,这两句代码的顺序通常是按照先创建主窗口,然后再创建 GUI 对象的方式进行的。

这个例子创建了一个简单的Tkinter GUI窗口,包含一个标签和一个按钮。当按钮被点击时,标签的文本将被更新。以下是代码的解释:

  • tk.Tk() 创建了一个主窗口对象。
  • SimpleGUI 类是我们创建的GUI应用程序的主要类。在构造方法 __init__ 中,我们定义了窗口的标题、标签和按钮,并将它们打包(pack)到窗口中。
  • on_button_click 方法是按钮点击事件的处理函数,它会更新标签的文本。
  • root.mainloop() 启动了Tkinter的主循环,使窗口保持打开状态并等待用户交互。

要运行这个代码,确保你的Python环境中安装了tkinter库,然后将代码保存为.py文件,运行即可看到GUI窗口。

关于为什么要起别名:

以及是用库名来调用库中的方法

这句代码 import tkinter as tk 表示导入 tkinter 模块,并为它起了一个别名 tk。这样,你可以使用 tk 这个别名来调用 tkinter 模块中的方法和类,使代码更简洁。

例如,原本你可能会这样写:

import tkinter

root = tkinter.Tk()
label = tkinter.Label(root, text="Hello, Tkinter!")
root.mainloop()

使用别名后,你可以写成:

import tkinter as tk

root = tk.Tk()
label = tk.Label(root, text="Hello, Tkinter!")
root.mainloop()

这样做的好处是减少代码中的重复,使代码更简洁易读。别名的选择通常是根据个人或团队的习惯,只要不与其他已有的名称冲突即可。

2.在窗口中加入组件

按钮的创建

tk.Button

在 Tkinter 中,可以使用 Button 类来创建按钮。以下是一个简单的例子,演示如何创建一个按钮:

import tkinter as tk

class SimpleGUI:
    def __init__(self, master):
        self.master = master
        master.title("Simple GUI")

        self.label = tk.Label(master, text="Hello, Tkinter!")
        self.label.pack()

        # 创建按钮
        self.button = tk.Button(master, text="Click Me", command=self.on_button_click)
        self.button.pack()

    def on_button_click(self):
        self.label.config(text="Button Clicked!")

# 创建主窗口
root = tk.Tk()

# 创建并运行 GUI
app = SimpleGUI(root)

# 运行主循环
root.mainloop()

在上面的例子中,通过 tk.Button 创建了一个按钮对象,并通过 text 参数设置按钮上的文本。command 参数指定了按钮点击时要调用的函数,这里是 on_button_click 方法。按钮创建后,使用 pack() 方法将按钮添加到主窗口中。

当按钮被点击时,on_button_click 方法会被调用,其中我们通过 self.label.config() 更新了标签的文本。

你可以根据需要自定义按钮的外观、行为以及与按钮相关联的事件处理函数。

按钮的动作

command

在Tkinter中,可以使用command参数为按钮设置动作事件。动作事件是指当按钮被点击时执行的操作。你可以将一个函数或方法绑定到按钮,使其在按钮被点击时调用。

下面是一个例子,演示如何为按钮设置动作事件:

import tkinter as tk

class SimpleGUI:
    def __init__(self, master):
        self.master = master
        master.title("Simple GUI")

        self.label = tk.Label(master, text="Hello, Tkinter!")
        self.label.pack()

        # 创建按钮并设置动作事件
        self.button = tk.Button(master, text="Click Me", command=self.on_button_click)
        self.button.pack()

    def on_button_click(self):
        self.label.config(text="Button Clicked!")
        # 在按钮点击时执行的其他操作

# 创建主窗口
root = tk.Tk()

# 创建并运行 GUI
app = SimpleGUI(root)

# 运行主循环
root.mainloop()

在上述例子中,command=self.on_button_click 将按钮的动作事件与 on_button_click 方法关联起来。当按钮被点击时,on_button_click 方法会被调用,其中我们更新了标签的文本,并可以在该方法中执行其他需要在按钮点击时进行的操作。

你可以根据需要定义其他的动作事件处理方法,然后将它们与按钮关联,以实现特定的功能。

按钮的坐标管理

在Tkinter中,按钮的坐标管理通常通过不同的几何管理器(geometry manager)来完成。Tkinter支持三种主要的几何管理器:packgridplace。这些几何管理器允许你在窗口中放置按钮并管理它们的位置。

以下是每个几何管理器的简要说明:

  1. pack 几何管理器: pack 将组件放置在其父容器的边缘上,可以指定组件的位置,但默认是垂直排列。示例:

    self.button.pack(side="left", padx=10, pady=10)
    
  2. grid 几何管理器: grid 将组件放置在一个表格中,可以指定组件的行和列。示例:

    self.button.grid(row=0, column=0, padx=10, pady=10)
    
  3. place 几何管理器: place 允许你以绝对坐标放置组件,相对于其父容器的左上角。示例:

    self.button.place(x=50, y=50)
    

以下是一个完整的示例,演示如何使用packgridplace来管理按钮的坐标:

import tkinter as tk

class GeometryManagerExample:
    def __init__(self, master):
        self.master = master
        master.title("Geometry Manager Example")

        # 创建按钮并使用 pack 几何管理器
        button_pack = tk.Button(master, text="Pack")
        button_pack.pack(side="left", padx=10, pady=10)

        # 创建按钮并使用 grid 几何管理器
        button_grid = tk.Button(master, text="Grid")
        button_grid.grid(row=0, column=1, padx=10, pady=10)

        # 创建按钮并使用 place 几何管理器
        button_place = tk.Button(master, text="Place")
        button_place.place(x=100, y=50)

# 创建主窗口
root = tk.Tk()

# 创建并运行 GUI
app = GeometryManagerExample(root)

# 运行主循环
root.mainloop()

在这个例子中,三个按钮分别使用了packgridplace几何管理器,你可以根据需要选择适合你布局的管理器。

3.Tkinter组件及其属性

label组件和entry组件

在Python中,tkinter 模块是一个常用的图形用户界面(GUI)工具包,它包含了创建窗口和各种界面元素的类和方法。Label 组件和 Entry 组件是两个常用的界面元素,用于显示文本和接收用户输入。

  1. Label(标签)组件:
    Label 组件用于在窗口中显示静态文本或图像。以下是一个简单的示例,演示如何创建一个标签组件:

    import tkinter as tk
    
    root = tk.Tk()
    label = tk.Label(root, text="这是一个标签")
    label.pack()
    
    root.mainloop()
    

    在这个例子中,创建了一个 Tk 窗口,并在窗口中放置了一个标签,标签上显示着文本 “这是一个标签”。

  2. Entry(输入框)组件:
    Entry 组件用于允许用户输入文本。以下是一个简单的示例,演示如何创建一个输入框组件:

    import tkinter as tk
    
    def on_button_click():
        entered_text = entry.get()
        print("输入的文本是:", entered_text)
    
    root = tk.Tk()
    
    entry = tk.Entry(root)
    entry.pack()
    
    button = tk.Button(root, text="获取文本", command=on_button_click)
    button.pack()
    
    root.mainloop()
    

    在这个例子中,创建了一个输入框和一个按钮。当用户输入文本并点击按钮时,程序将获取输入框中的文本并打印出来。

以上代码只是简单的演示,你可以根据需要进行更复杂的界面设计和交互。希望这能帮助你开始使用 LabelEntry 组件。

listbox组件

tkinter 中的 Listbox 组件用于在窗口中显示一个列表,并允许用户选择其中的项。以下是一个简单的示例,演示如何创建和使用 Listbox 组件:

import tkinter as tk

def on_select(event):
    selected_item = listbox.get(listbox.curselection())
    print("选择的项是:", selected_item)

root = tk.Tk()

# 创建 Listbox 组件
listbox = tk.Listbox(root, selectmode=tk.SINGLE)
listbox.pack()

# 向 Listbox 中添加项
for item in ["项1", "项2", "项3", "项4"]:
    listbox.insert(tk.END, item)

# 绑定选择事件
listbox.bind('<<ListboxSelect>>', on_select)

root.mainloop()

在这个例子中,创建了一个 Tk 窗口和一个 Listbox 组件。通过使用 insert 方法,将一些项添加到列表框中。然后,使用 bind 方法绑定了选择事件,当用户选择列表框中的项时,触发 on_select 函数。

on_select 函数获取用户选择的项,并打印出来。请注意,selectmode 参数指定了选择模式,tk.SINGLE 表示只能选择一个项。

你可以根据需要更改选择模式,也可以使用 listbox.curselection() 获取当前选择的索引。这只是一个简单的示例,你可以根据实际需求进行更复杂的列表框设计。

canvas组件

tkinter 中的 Canvas 组件用于创建绘图区域,允许你在窗口中绘制图形、文本和其他元素。以下是一个简单的示例,演示如何创建和使用 Canvas 组件:

import tkinter as tk

def draw_circle():
    canvas.create_oval(50, 50, 150, 150, fill="blue")

def draw_rectangle():
    canvas.create_rectangle(200, 50, 300, 150, fill="red")

root = tk.Tk()

# 创建 Canvas 组件
canvas = tk.Canvas(root, width=400, height=200)
canvas.pack()

# 创建按钮并绑定绘制函数
circle_button = tk.Button(root, text="绘制圆形", command=draw_circle)
circle_button.pack(side=tk.LEFT)

rectangle_button = tk.Button(root, text="绘制矩形", command=draw_rectangle)
rectangle_button.pack(side=tk.LEFT)

root.mainloop()

在这个例子中,创建了一个 Tk 窗口和一个 Canvas 组件。通过 create_oval 方法和 create_rectangle 方法,可以在画布上绘制圆形和矩形。两个按钮分别触发 draw_circledraw_rectangle 函数,绘制对应的图形。

可以根据需要在画布上绘制各种形状、线条、文本等。Canvas 组件提供了多个方法来进行绘图,可以满足各种绘图需求。

十,数据分析与可视化

1.数值计算库numpy

NumPy 是一个用于数值计算的强大的 Python 库。它提供了一个多维数组对象(numpy.ndarray)和一组用于处理这些数组的函数。以下是一些 NumPy 的基本用法和功能:

  1. 导入 NumPy:
    在使用 NumPy 之前,需要导入它:

    import numpy as np
    

    通常使用 np 作为别名,以方便在代码中引用 NumPy。

  2. 创建数组:
    使用 numpy.array 函数可以创建 NumPy 数组:

    arr = np.array([1, 2, 3, 4, 5])
    

    这样就创建了一个包含 [1, 2, 3, 4, 5] 的一维数组。

  3. 基本操作:
    NumPy 数组支持基本的数学运算,例如加法、减法、乘法和除法:

    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    
    result = a + b
    

    result 将包含 [5, 7, 9]

  4. 多维数组:
    NumPy 支持多维数组,可以创建二维、三维等数组:

    matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    

    这是一个3x3的二维数组。

  5. 数组索引和切片:
    NumPy 数组可以通过索引和切片进行访问和操作:

    a = np.array([1, 2, 3, 4, 5])
    print(a[2])  # 输出: 3
    

    或者:

    matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(matrix[1, 2])  # 输出: 6
    
  6. 数学函数:
    NumPy 提供了许多数学函数,如 np.sinnp.cosnp.exp 等,可以在数组上进行元素级别的操作。

    angles = np.array([0, np.pi/2, np.pi])
    sin_values = np.sin(angles)
    

    sin_values 将包含 [0, 1, 0]

这只是 NumPy 的一小部分功能,它还包括线性代数、统计、随机数生成等功能。

2.科学计算扩展库scipy

SciPy 是建立在 NumPy 基础上的科学计算扩展库,它提供了许多用于解决科学和工程问题的高级功能。SciPy 包含了许多子模块,每个子模块都专注于解决特定类型的问题。以下是一些 SciPy 子模块和其功能的简要介绍:

  1. 插值(Interpolation):
    scipy.interpolate 模块提供了插值函数,用于在给定数据点之间进行插值。

  2. 优化(Optimization):
    scipy.optimize 模块包含了各种最优化算法,用于寻找函数的最小值或最大值。

  3. 线性代数(Linear Algebra):
    scipy.linalg 模块扩展了 NumPy 的线性代数功能,提供了更多的线性代数操作。

  4. 信号处理(Signal Processing):
    scipy.signal 模块包含了许多信号处理工具,如滤波、频谱分析等。

  5. 统计(Statistics):
    scipy.stats 模块包含了统计学函数,用于执行各种统计分析。

  6. 积分(Integration):
    scipy.integrate 模块提供了积分函数,用于数值积分和微分方程求解。

  7. 图像处理(Image Processing):
    scipy.ndimage 模块包含了用于图像处理的函数,如滤波、形态学操作等。

  8. 稀疏矩阵(Sparse Matrix):
    scipy.sparse 模块提供了用于处理大规模稀疏矩阵的工具,包括线性代数操作。

  9. 空间距离(Spatial distance):
    scipy.spatial 模块包含了用于计算空间距离的函数,如距离矩阵的计算等。

以上只是 SciPy 的一些功能模块,它还包括其他一些子模块,每个子模块都提供了一组相关的工具和算法。通过结合 NumPySciPy,你可以进行更广泛领域的科学计算和数据分析。

3.数值计算可视化库matplotlib

matplotlib 是一个用于绘制二维图形的强大可视化库,主要用于数据可视化、绘制图表和图形等。它支持多种绘图风格,可以用于创建线图、散点图、柱状图、饼图等各种图表类型。以下是一些 matplotlib 的基本用法和功能:

  1. 导入 matplotlib:
    在使用 matplotlib 之前,需要导入它:

    import matplotlib.pyplot as plt
    

    通常使用 plt 作为别名。

  2. 绘制简单的线图:

    import matplotlib.pyplot as plt
    
    # 创建数据
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]
    
    # 绘制线图
    plt.plot(x, y)
    
    # 显示图形
    plt.show()
    
  3. 散点图:

    import matplotlib.pyplot as plt
    
    # 创建数据
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]
    
    # 绘制散点图
    plt.scatter(x, y)
    
    # 显示图形
    plt.show()
    
  4. 柱状图:

    import matplotlib.pyplot as plt
    
    # 创建数据
    categories = ['A', 'B', 'C', 'D']
    values = [3, 7, 2, 5]
    
    # 绘制柱状图
    plt.bar(categories, values)
    
    # 显示图形
    plt.show()
    
  5. 饼图:

    import matplotlib.pyplot as plt
    
    # 创建数据
    sizes = [25, 30, 20, 25]
    labels = ['Category A', 'Category B', 'Category C', 'Category D']
    
    # 绘制饼图
    plt.pie(sizes, labels=labels, autopct='%1.1f%%')
    
    # 显示图形
    plt.show()
    

这只是 matplotlib 的一小部分功能,它还支持自定义图表样式、添加标签、网格线等。matplotlib 可以与 NumPySciPy 结合使用,以实现更复杂的数据分析和可视化任务。