本文承接上篇文章python基础知识之语句(三)继续回顾python基础知识中的的
函数定义语句
函数是编程中的基础构造块之一,它允许我们将代码块封装起来,并在需要时重复调用。在Python中,我们使用def关键字定义函数。
函数定义的基本语法如下:
def function_name(parameters):
# function body
...
return value # This is optional
以下是函数定义的各个部分的详细解释:
-
def
关键字:这是声明函数的关键字。 -
函数名:
function_name
是函数的名字。函数名应该是描述性的,并且遵循小写字母和下划线的命名规范。 -
参数:
parameters
是函数可以接受的输入。这些是在函数调用时传递的值。你可以定义任意数量的参数,或者不定义任何参数。 -
函数体:这是函数执行的代码。它是缩进的,表明它是函数的一部分。
-
return
语句:这是可选的。如果存在,函数会返回指定的值。如果没有return
语句,函数默认返回None。
以下是一个简单的函数定义示例,该函数接受两个参数并返回它们的和:
def add_numbers(a, b):
result = a + b
return result
现在,只需要熟悉函数即可,后续章节将具体对函数的构建与引用做具体描述。
返回语句
返回语句(return
)在Python中用于从函数中返回一个值。当return语句被执行时,函数的执行立即停止,并且返回值返回给调用者。
以下是关于return
语句的一些关键点:
- 基本使用:你可以使用
return
关键字后跟一个值或表达式来从函数中返回这个值或表达式的结果。
def square(x):
return x * x
当这个函数被调用时,它会返回x的平方。
- 返回多个值:可以使用元组从函数中返回多个值。
def min_max(nums):
return min(nums), max(nums)
当调用这个函数时,它会返回一个包含两个值的元组:列表中的最小值和最大值。
-无返回值:如果函数没有return
语句,或者return
语句后面没有任何值,那么函数会默认返回None
。
def print_hello(name):
print(f"Hello, {name}!")
在这个函数中,没有return
语句,所以它返回None
。
- 提前退出:return语句可以用于在满足某个条件时提前退出函数。
def is_positive(number):
if number <= 0:
return False
# Some other computations might go here
return True
在上面的例子中,如果number是非正数,函数会在完成其他计算之前立即返回False。
-返回函数或闭包:函数可以返回另一个函数或闭包。
def multiplier(factor):
def multiply_by_factor(x):
return x * factor
return multiply_by_factor
在这个例子中,multiplier函数返回一个函数multiply_by_factor,这个返回的函数可以用来乘以指定的因子。
总的来说,return语句在Python中是一个强大的工具,它不仅允许你从函数中返回值,还可以控制函数的执行流程。
异常处理语句
在Python中,异常处理是使用try
、except
、else
和finally
块来实现的。这些语句提供了捕获和处理运行时错误(即异常)的机制,而不是让程序突然终止。
以下是异常处理相关语句的详细介绍:
-
try
块:此块中的代码是你希望尝试执行的代码,但你认为这些代码可能会抛出异常。 -
except
块:当try
块中的代码引发异常时,此块中的代码将被执行。 -
else
块:如果try
块中的代码没有引发任何异常,那么此块中的代码将被执行。 -
finally
块:无论try
块中的代码是否引发异常,此块中的代码都将被执行。这通常用于清理操作,例如关闭文件或释放资源。
其使用方法如下:
try:
# Code that might raise an exception
...
except SomeException:
# Handle the exception
...
else:
# Code to run if there was no exception
...
finally:
# Cleanup code that runs no matter what
...
另外,需要注意的是except
捕获异常的用法,它定义了当try
块中的代码引发异常时应该执行的操作。简单地说,可以将except
看作是“如果尝试执行某些操作并失败了,那么做这些操作”。另外,python中内置了许多常用的异常类型,用于表示不同种类的运行时错误。
-
BaseException
:所有异常的基类。通常,你不应该直接使用此异常,而是使用它的子类。 -
Exception
:几乎所有内置的非系统退出异常都是从这个类派生出来的。这是你通常应该使用的基类,当你想捕获所有非系统退出的异常时。 -
ArithmeticError
:所有数值计算错误的基类。
(1)OverflowError
: 发生当数学运算结果太大而无法表示时。
(2)ZeroDivisionError
: 尝试除以零时引发。
(3)FloatingPoint
Error: 浮点计算失败时引发。 -
LookupError
:所有查找错误的基类。
(1)IndexError
: 列表或其他序列类型中的索引超出范围时引发。
(2)KeyError
: 字典查找失败时引发。 -
AttributeError
: 尝试访问未知的对象属性时引发。 -
EOFError
:input()
函数读取到文件结束符(EOF
)时引发。 -
NameError
: 尝试访问未声明的局部或全局变量时引发。
(1)UnboundLocalError
: 引用局部变量之前尝试赋值给它时引发。 -
TypeError
: 对类型不正确的对象执行操作时引发。 -
ValueError
: 当函数的参数有正确的类型但不允许的值时引发。 -
ImportError
: 导入模块或使用from ... import ...
失败时引发。
(1)ModuleNotFoundError
: 尝试导入不存在的模块时引发。 -
FileNotFoundError
: 尝试打开不存在的文件时引发。 -
IOError: 输入/输出操作失败,如打开文件时。
(1)OSError
: 操作系统产生的错误(例如打开文件失败)。 -
SystemError
: Python解释器发现错误时引发。 -
RuntimeError
: 检测到不属于任何其他类别的错误时引发。 -
KeyboardInterrupt
: 当用户按下中断键(通常是Ctrl+C)时引发。 -
StopIteration
: 内置的next()函数和迭代器的__next__()
方法中引发,表示迭代器没有更多的项目。 -
MemoryError
: 操作因为内存不足而失败时引发。
这只是Python中可用的内置异常的一个子集。还有更多其他的异常,但是不需要全部记住,记住常用的error类型就可以。另外,在不确定错误类型时,最好的方法就是使用Exception
来捕获所有类型的错误,以便后续调试。以下给出几种常见的捕获异常的用法:
- 捕获特定的异常:可以为不同的异常类型指定不同的
except
块。
try:
# some code
except ValueError:
# handle ValueError exception
except TypeError:
# handle TypeError exception
还可以在一个except
块中捕获多个异常:
try:
# some code
except (ValueError, TypeError):
# handle both ValueError and TypeError exceptions
- 获取异常的信息:使用
as
关键字,你可以获取引发的异常的详细信息。
try:
# some code
except ValueError as e:
print(f"Caught an exception: {e}")
- 无条件的
except
:如果想捕获所有类型的异常,可以使用不带任何异常类的except:
try:
# some code
except:
# handle all exceptions
注意:使用无条件的except
是不推荐的,因为它会捕获所有异常,包括意外的异常和你可能不想处理的系统退出异常。但是对于某些简单任务,或者对于基础知识不牢固的使用人员来说,使用无条件except
也能够减轻编程压力。
finally
块:
这个块是可选的,但当存在时,不管是否有异常,它都会执行。这对于确保资源被正确释放,如关闭文件或网络连接,是非常有用的。
下面给出一个简单示例,演示如何使用异常处理读取一个整数:
def read_integer():
try:
number = int(input("Enter an integer: "))
except ValueError:
print("That's not an integer!")
else:
print(f"You entered: {number}")
finally:
print("Exiting the function.")
read_integer()
# 输入9.0 输出 That's not an integer! Exiting the function.
导入语句
在Python中,导入语句允许你使用其他模块中的函数、类和变量。这使得代码重用、组织和维护变得更容易。以下是Python中的几种导入语句及其用法。
- import语句:这是最基本的导入方法,它导入一个模块并允许你使用该模块的名称访问其内容。
语法
import module_name
使用:
import math
print(math.sqrt(16)) # 输出: 4.0
2. from ... import ...
语句
这种方法允许从一个模块中导入特定的函数、类或变量。
语法:
from module_name import item_name
使用:
from math import sqrt
print(sqrt(16)) # 输出: 4.0
也可以使用这种方法一次导入多个项:
from math import sqrt, pi
print(sqrt(16)) # 输出: 4.0
print(pi) # 输出: 3.141592653589793
import ... as ...
语句
这种方法允许你为导入的模块或项提供一个别名。这在处理名称冲突或使用名称过长的模块时非常有用。
语法:
import module_name as alias_name
from module_name import item_name as alias_name
使用:
import math as m
print(m.sqrt(16)) # 输出: 4.0
from math import sqrt as square_root
print(square_root(16)) # 输出: 4.0
4. from ... import *
语句
这种方法从一个模块中导入所有内容。虽然这可能很方便,但通常不推荐使用,因为它可能会导致名称冲突,并使得代码的来源不明确。
语法:
from module_name import *
使用:
from math import
print(sqrt(16)) # 输出: 4.0
print(pi) # 输出: 3.141592653589793
注意模块查找路径:Python查找模块的路径存储在sys.path列表中。这个列表包括当前目录、Python安装目录和PYTHONPATH环境变量中指定的目录。内置模块:Python有许多内置模块,如math
、sys
和os
,这些模块提供了核心功能。可以使用import
语句直接导入这些模块。第三方模块:除了内置模块,Python还有一个庞大的第三方模块生态系统,这些模块可以通过工具如pip
安装。
退出语句
在Python中,退出语句主要是指那些用于提前终止程序执行或退出当前执行上下文的语句。常用的包括return
, break
, continue
, pass
, exit()
, quit()
, sys.exit()
等,与前文中重复的部分不再描述。
pass
用途:空操作语句。它什么也不做,通常用作占位符,确保代码结构的完整性。
示例:
def some_function():
pass
exit()
,quit()
用途:退出Python解释器,通常用于交互式会话。在脚本中,推荐使用sys.exit()
。
示例:
import sys
if some_error_condition:
sys.exit("Error message")
sys.exit()
用途:退出程序并返回一个状态码。0通常表示正常退出,而非零值表示有错误。
示例:
import sys
if some_error_condition:
sys.exit(1)
断言assert
语句
断言语句(assert
)在Python中用于在代码中设置检查点,确保程序中的某些条件始终为真。如果断言失败(即断言的表达式求值为False),则会引发一个AssertionError
异常。这可以帮助程序员在开发和测试阶段捕获和识别潜在的错误或异常情况。
语法
assert expression, [message]
expression
: 要求值的表达式,其结果应该是True
或False
。message
: (可选)当断言失败时,即为False
时要显示的消息。
示例:
x = 5
assert x > 0, "x should be positive"
# 由于 x 是正数,所以断言成功,没有输出。
x = -5
assert x > 0, "x should be positive"
# 输出(引发异常): AssertionError: x should be positive
def divide(a, b):
assert b != 0, "Cannot divide by zero!"
return a / b
result = divide(10, 2)
# 断言成功,所以没有输出。
result = divide(10, 0)
# 输出(引发异常): AssertionError: Cannot divide by zero!
删除语句
在Python中,del
是一个关键字,用于删除对象的引用或从集合中移除元素。当与Python的垃圾回收机制结合使用时,del
可以帮助释放资源和内存。
以下是del语句的一些常见用法和描述:
- 删除变量引用, 可以使用
del
来删除一个变量的引用,这样该变量就不再存在了。
x = 10
print(x) # 输出: 10
del x
# print(x) # 如果此行被取消注释,将引发一个NameError,因为x不再存在。
- 从列表中删除元素,使
del
与索引结合,可以从列表中删除特定位置的元素。
my_list = [1, 2, 3, 4, 5]
del my_list[1]
print(my_list) # 输出: [1, 3, 4, 5]
- 删除切片, 可以使用del删除列表的一个切片。
my_list = [1, 2, 3, 4, 5]
del my_list[1:3]
print(my_list) # 输出: [1, 4, 5]
- 从字典中删除键, 可以使用del从字典中删除特定的键和其对应的值。
my_dict = {"a": 1, "b": 2, "c": 3}
del my_dict["b"]
print(my_dict) # 输出: {'a': 1, 'c': 3}
- 删除对象属性,如果一个对象具有动态属性(例如,使用
setattr
方法设置的属性),你可以使用del
删除这些属性。
class MyClass:
def __init__(self):
self.x = 10
obj = MyClass()
print(obj.x) # 输出: 10
del obj.x
# print(obj.x) # 如果此行被取消注释,将引发一个AttributeError,因为x属性已被删除。
注意:
-
当使用del删除一个对象的最后一个引用时,该对象的内存可能会被回收。但实际的内存回收时间取决于Python的垃圾回收机制。
-
仅仅因为使用del删除了一个对象的引用,并不意味着该对象的内存立即被释放。对象的内存释放是由Python的垃圾回收机制管理的。
-
尽管del可以删除对象的引用,但通常不需要在Python代码中频繁使用它,因为Python的垃圾回收机制会自动处理不再使用的对象。但在某些情况下,如处理大量数据或在需要释放资源的特定时刻,使用del可能会有所帮助。
全局和非局部声明
在Python中,当你在函数内部想要修改全局变量或封闭作用域(例如在嵌套函数中)的变量时,你需要使用global
和nonlocal
声明。
global
声明
当你在一个函数内部想要修改全局变量的值时,你需要使用global
关键字。否则,Python会在函数内部为该变量创建一个新的局部变量。
示例:
python
Copy code
x = 10
def change_global_x():
global x
x = 20
change_global_x()
print(x) # 输出: 20
在上面的例子中,使用global
关键字告诉Python,我们在change_global_x
函数内部引用的是全局变量x,而不是创建一个新的局部变量。
nonlocal
声明
当在一个嵌套函数(一个函数内部的函数)中想要修改封闭函数的局部变量时,你需要使用nonlocal
关键字。
示例:
def outer_function():
y = 10
def inner_function():
nonlocal y
y = 20
inner_function()
print(y) # 输出: 20
outer_function()
在上面的例子中,inner_function
是一个嵌套函数,它在outer_function
的内部。我们使用nonlocal
关键字来告诉Python,我们想要修改outer_function
的y变量,而不是在inner_function
内部创建一个新的局部变量。
注意事项:
-
如果你不使用
global
或nonlocal
关键字,函数内部的变量赋值会默认为局部变量。 -
global
和nonlocal
只影响变量的赋值。即使没有这些关键字,你仍然可以在函数内部访问全局或非局部变量的值。 -
使用
global
和nonlocal
应该小心,因为修改外部作用域的变量可能会导致代码更难理解和维护。
另外,设置全局随机种子对于代码的可复现性非常重要。随机种子一旦被设定,那么在该文件重复运行时,所有用到随机数的地方在第二次运行该文件时都可以生成相同的随机数。这在测试、调试和分享代码时非常有用,因为其他人可以获得与你相同的“随机”结果。
import random
# 设置随机种子
random.seed(12345)
# 之后的随机数生成将是可重复的
print(random.random()) # 输出: 0.41661987254534116
print(random.randint(1, 10)) # 输出: 2
import numpy as np
np.random.seed(12345)
print(np.random.rand()) # 输出: 0.9296160928171479
当然,也可以设置局部随机种子,但是不建议这么做,麻烦也无用。
其他内容请参考前期python基础知识之语句(一)