Python 基础较难理解的 15 个知识
ztj100 2024-12-17 17:46 34 浏览 0 评论
1. 面向对象编程(Object-Oriented Programming, OOP)
面向对象编程是一种程序设计思想,它将代码组织成可重用的对象,并通过定义类、创建对象和调用方法来实现。
类与对象
类是一个模板,描述了对象的属性和操作。对象是类的实例,可以访问类的属性和方法。
示例:
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name} is barking!")
my_dog = Dog("Buddy")
my_dog.bark() # 输出结果: Buddy is barking!
解释:
__init__ 方法是类的构造函数,用于初始化对象的属性。
bark 方法是类的一个方法,用于执行特定的操作。
继承
继承允许创建一个新类,从现有的类中继承属性和方法。子类可以重写或扩展父类的功能。
示例:
class Animal:
def eat(self):
print("The animal is eating.")
class Cat(Animal):
def meow(self):
print("Meow!")
my_cat = Cat()
my_cat.eat() # 输出结果: The animal is eating.
my_cat.meow() # 输出结果: Meow!
解释:
Cat 类继承了 Animal 类,因此 Cat 类的实例可以调用 eat 方法。
meow 方法是 Cat 类特有的方法。
多态
多态允许不同类的对象对相同的方法做出不同的响应。这使得代码更灵活、可扩展和可维护。
示例:
class Shape:
def draw(self):
raise NotImplementedError()
class Circle(Shape):
def draw(self):
print("Drawing a circle.")
class Rectangle(Shape):
def draw(self):
print("Drawing a rectangle.")
def draw_shape(shape):
shape.draw()
circle = Circle()
rectangle = Rectangle()
draw_shape(circle) # 输出结果: Drawing a circle.
draw_shape(rectangle) # 输出结果: Drawing a rectangle.
解释:
Shape 类定义了一个 draw 方法,但没有具体实现,子类必须实现这个方法。
Circle 和 Rectangle 类分别实现了 draw 方法。
draw_shape 函数接受一个 Shape 对象并调用其 draw 方法。
2. 迭代器与生成器
迭代器和生成器是 Python 中处理可迭代对象的重要概念,它们可以逐个地处理序列中的元素。
迭代器
迭代器是一个实现了 __iter__() 和 __next__() 方法的对象。它通过 __next__() 方法返回序列中的下一个元素,并在没有更多元素时引发 StopIteration 异常。
示例:
numbers = [1, 2, 3]
iter_numbers = iter(numbers)
print(next(iter_numbers)) # 输出结果: 1
print(next(iter_numbers)) # 输出结果: 2
print(next(iter_numbers)) # 输出结果: 3
解释:
iter 函数将列表转换为迭代器。
next 函数获取迭代器的下一个元素。
生成器
生成器是一种特殊的迭代器,它使用 yield 关键字来定义。生成器函数会暂停执行并返回一个值,然后在下一次访问时继续执行。这样可以节省内存,并使代码更简洁。
示例:
def even_numbers(n):
for i in range(n):
if i % 2 == 0:
yield i
for num in even_numbers(10):
print(num) # 输出结果: 0, 2, 4, 6, 8
解释:
even_numbers 是一个生成器函数,使用 yield 关键字返回偶数。
for 循环遍历生成器,每次调用 yield 时生成一个值。
3. 异常处理
异常处理是一种捕获和处理程序中出现的错误的机制。Python 提供了 try-except-finally 语句来处理异常。
示例:
try:
result = 10 / 0
except ZeroDivisionError:
print("除零错误!")
finally:
print("清理代码。")
解释:
try 块中的代码可能会引发 ZeroDivisionError 异常。
except 块捕获并处理 ZeroDivisionError 异常。
finally 块中的代码无论是否发生异常都会执行。?
4. 并发与多线程
并发和多线程是指同时执行多个任务的能力。
并发
并发是指程序设计的一种方式,使得多个任务在同一时间段内交替执行。Python 中的 threading 模块可以用于实现并发。
示例:
import threading
def print_numbers():
for i in range(1, 6):
print(i)
def print_letters():
for letter in ['a', 'b', 'c', 'd', 'e']:
print(letter)
t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)
t1.start()
t2.start()
t1.join()
t2.join()
解释:
print_numbers 和 print_letters 是两个函数,分别打印数字和字母。
threading.Thread 创建两个线程 t1 和 t2,分别执行这两个函数。
start 方法启动线程。
join 方法等待线程执行完毕。
多线程
多线程是指在一个进程中运行多个线程的能力。Python 使用全局解释器锁(GIL)来确保同一时间只有一个线程执行 Python 字节码。因此,在 CPU 密集型任务中,多线程可能无法实现真正的并行。
5. 文件操作和异常处理
文件操作是一种常见的编程任务,而异常处理则用于在文件操作中处理潜在的错误。
示例:
try:
with open("example.txt", "r") as file:
contents = file.read()
except FileNotFoundError:
print("文件未找到!")
except PermissionError:
print("权限被拒绝!")
else:
print(contents)
finally:
print("清理代码。")
解释:
with 语句确保文件在操作完成后自动关闭。
try 块中的代码尝试打开并读取文件。
except 块捕获并处理 FileNotFoundError 和 PermissionError 异常。
else 块在没有异常时执行。
finally 块中的代码无论是否发生异常都会执行。?
6. 迭代与推导式
迭代是指遍历序列中的元素的过程。Python 提供了多种迭代方式,如 for 循环、列表推导式、生成器表达式等。
示例:
fruits = ["apple", "banana", "cherry"]
# 使用 for 循环迭代
for fruit in fruits:
print(fruit)
# 使用列表推导式创建新列表
upper_fruits = [fruit.upper() for fruit in fruits]
print("大写的水果列表:", upper_fruits) # 输出结果: ['APPLE', 'BANANA', 'CHERRY']
# 使用生成器表达式计算总长度
total_length = sum(len(fruit) for fruit in fruits)
print("总长度:", total_length) # 输出结果: 18
解释:
for 循环遍历列表中的每个元素。
列表推导式 [fruit.upper() for fruit in fruits] 创建一个新列表,其中每个元素都是原列表中对应元素的大写形式。
生成器表达式 sum(len(fruit) for fruit in fruits) 计算列表中所有元素的总长度。
7. 装饰器(Decorators)
装饰器是一种特殊类型的函数,可以修改其他函数的行为或功能,而无需改变其源代码。
示例:
def my_decorator(func):
def wrapper():
print("在函数之前执行的代码")
func()
print("在函数之后执行的代码")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
# 输出结果:
# 在函数之前执行的代码
# Hello!
# 在函数之后执行的代码
解释:
my_decorator 是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数 wrapper。
@my_decorator 语法糖表示 say_hello 函数被 my_decorator 装饰。
当调用 say_hello 时,实际上是调用了 wrapper 函数。?
8. 上下文管理器(Context Managers)
上下文管理器用于设置和清理资源,通常用于文件操作和数据库连接等场景。
示例:
class MyContextManager:
def __enter__(self):
print("进入上下文")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出上下文")
with MyContextManager() as manager:
print("在上下文中执行的代码")
# 输出结果:
# 进入上下文
# 在上下文中执行的代码
# 退出上下文
解释:
MyContextManager 类实现了 __enter__ 和 __exit__ 方法。
with 语句确保在进入和退出上下文时分别调用 __enter__ 和 __exit__ 方法。
9. 闭包(Closures)
闭包是指一个函数对象,它记录了其包含的自由变量的环境。
示例:
def outer_function(msg):
def inner_function():
print(msg)
return inner_function
hi_func = outer_function("Hi")
bye_func = outer_function("Bye")
hi_func() # 输出结果: Hi
bye_func() # 输出结果: Bye
解释:
outer_function 是一个外部函数,它定义了一个内部函数 inner_function。
inner_function 访问了外部函数的参数 msg。
outer_function 返回 inner_function,从而形成了闭包。?
10. 属性访问(Property)
属性访问允许你控制对类属性的访问,通常用于实现数据验证和封装。
示例:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("年龄不能为负数")
self._age = value
person = Person("Alice", 30)
print(person.age) # 输出结果: 30
person.age = 35
print(person.age) # 输出结果: 35
# person.age = -1 # 抛出 ValueError: 年龄不能为负数
解释:
@property 装饰器将 age 方法转换为只读属性。
@age.setter 装饰器允许设置 age 属性,并进行数据验证。?
11. 类方法和静态方法(Class Methods and Static Methods)
类方法和静态方法是类中的特殊方法,用于处理类级别的操作。
示例:
class MyClass:
count = 0
def __init__(self, name):
self.name = name
MyClass.count += 1
@classmethod
def get_count(cls):
return cls.count
@staticmethod
def info():
print("这是一个静态方法")
obj1 = MyClass("Obj1")
obj2 = MyClass("Obj2")
print(MyClass.get_count()) # 输出结果: 2
MyClass.info() # 输出结果: 这是一个静态方法
解释:
get_count 是一个类方法,可以通过类或实例调用。
info 是一个静态方法,与类的状态无关,可以通过类调用。?
12. 描述符(Descriptors)
描述符是一种协议类,用于管理属性的访问。描述符协议包括 __get__、__set__ 和 __delete__ 方法。
示例:
class Descriptor:
def __get__(self, instance, owner):
print("获取属性")
return instance._value
def __set__(self, instance, value):
print("设置属性")
instance._value = value
def __delete__(self, instance):
print("删除属性")
del instance._value
class MyClass:
value = Descriptor()
def __init__(self, value):
self.value = value
obj = MyClass(10)
print(obj.value) # 输出结果: 获取属性\n10
obj.value = 20 # 输出结果: 设置属性
del obj.value # 输出结果: 删除属性
解释:
Descriptor 类实现了描述符协议。
MyClass 类中的 value 属性是一个描述符。
通过 obj.value 访问、设置和删除属性时,会调用描述符的相应方法。
13. 元类(Metaclasses)
元类是类的类,用于创建和控制类的行为。
示例:
class Meta(type):
def __new__(cls, name, bases, dct):
print(f"Creating class {name}")
return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=Meta):
pass
obj = MyClass()
解释:
Meta 是一个元类,重写了 __new__ 方法。
MyClass 使用 Meta 作为元类,当创建 MyClass 时,会调用 Meta 的 __new__ 方法。
14. 递归(Recursion)
递归是一种函数调用自身的编程技术,通常用于解决分治问题。
示例:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
print(factorial(5)) # 输出结果: 120
解释:
factorial 函数是一个递归函数,计算阶乘。
基本情况是 n == 0,返回 1。
递归情况是 n > 0,返回 n * factorial(n - 1)。?
15. 动态导入(Dynamic Import)
动态导入允许在运行时根据需要导入模块。
示例:
module_name = "math"
module = __import__(module_name)
print(module.sqrt(16)) # 输出结果: 4.0
解释:
__import__ 函数用于动态导入模块。
module 是导入的模块对象,可以通过 module.sqrt 调用模块中的函数。
总结
以上是 Python 基础中较难理解的 15 个知识点的详细讲解和示例。通过这些示例,你可以更好地理解和应用这些概念,提高你的编程技能。如果你有任何其他问题或需要进一步的解释,请随时留言区提问。
相关推荐
- Java网络编程(JAVA网络编程技术)
-
网络编程三要素1.IP地址:表示设备在网络中的地址,是网络中设备的唯一标识2.端口号:应用程序在设备中唯一的标识3.协议:连接和数据在网络中传输的规则。InetAddress类Java中也有一个...
- 字节Java全能手册火了!多线程/网络/性能调优/框架啥都有
-
前言在这个技术不断更新的年代,跟不上时代变化的速度就会被刷掉,特别是咱们程序员这一群体,技术不断更新的同时也要同时进步,不然长江后浪推前浪,前浪......一个程序员从一个什么都不懂的小白在学到有一定...
- 一分钟了解java网络编程(java基础网络编程)
-
一、OSI七层网络模型应用层:Http协议、电子邮件传输、文件服务器等;表示层:数据转换,解决不同系统的兼容问题(跨语言);会话层:建立与应用程序的会话连接;传输层:提供了端口号和传输协议(TPC/U...
- Java编程-高并发情况下接口性能优化实践-提升吞吐量TPS
-
记得前段时间工作中接到一个任务是优化一个下单接口的性能提高接口的吞吐量TPS,前期通过arthas工具跟踪接口的具体方法调用链路及耗时,发现了影响此接口的性能瓶颈主要是加锁的方式,后来变更了锁的方式...
- socket 断线重连和心跳机制如何实现?
-
一、socket概念1.套接字(socket)是网络通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,...
- 迅速了解-Java网络编程(java基础网络编程)
-
Java网络编程在JavaSE阶段,我们学习了I/O流,既然I/O流如此强大,那么能否跨越不同的主机进行I/O操作呢?这就要提到Java的网络编程了。...
- Java网络编程详解(java 网络编程)
-
网络编程基础知识最!最!最!重要网络编程基础概念网络编程不等于网站编程,网络编程即使用套接字(socket)来达到各进程间的通信,现在一般称为TCP/IP编程;网络编程分为服务端和客户端。服务端就相当...
- 「开源推荐」高性能网络通信框架 HP-Socket v5.7.2
-
简介HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/...
- Java网络编程从入门到精通:打造属于你的网络世界
-
Java网络编程从入门到精通:打造属于你的网络世界在当今这个信息爆炸的时代,网络编程已经成为程序员必不可少的一项技能。而Java作为一种功能强大且广泛使用的编程语言,在网络编程领域也有着举足轻重的地位...
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
-
一、核心功能与定位1.Socket类:底层通信的基石-位于System.Net.Sockets命名空间,提供对网络协议栈的直接操作,支持TCP、UDP等多种协议。-手动管理连接细节:需...
- (三)谈谈 IO 模型(Socket 编程篇)
-
快过年啦,估计很多朋友已在摸鱼的路上。而我为了兄弟们年后的追逐,却在苦苦寻觅、规划,导致文章更新晚了些,各位猿粉谅解。上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让BIO、NIO编程过程呈...
- 大数据编程入门:Java网络编程(大数据 编程)
-
如果想要编写出一个可以运行在多个设备上的程序,应该怎么做呢?答案是网络编程,今天小编将为大家带来大数据编程入门:Java网络编程。一、网络编程概念网络编程是指编写在通过网络连接的多个设备(计算机)上运...
- 基于JAVA的社交聊天室(java聊天设计与实现)
-
基于Java的社交聊天室一、前言随着互联网技术的迅速发展,实时通信和在线社交已成为人们日常生活的重要组成部分。基于Java的社交聊天室系统,凭借其跨平台、高性能和安全性等特点,为用户提供了一个集中、开...
- java-socket长连接demo体验(java socket长连接)
-
作者:DavidDing来源:https://zhuanlan.zhihu.com/p/56135195一、前言最近公司在预研设备app端与服务端的交互方案,主要方案有:服务端和app端通过阿里i...
- JAVA数据库编程(java数据库编程指南)
-
预计更新###第一节:什么是JAVA-JAVA的背景和历史-JAVA的特点和应用领域-如何安装和配置JAVA开发环境###第二节:JAVA基础语法-JAVA的基本数据类型和变量-运算符和...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)