
附录 C 高级 Python 概念
C.1 类和对象
In [1]: class Car:def __init__(self, color, speed=0):self.color = colorself.speed = speeddef accelerate(self, mph):self.speed += mph
In [2]:来实例化两个机车对象 ZX = Car("red") YAMAHA = Car(color="blue")
In [3]:在默认情况下会打印出对象的内存位置 ZX Out[3]: <main.Car at 0x196e7d90550> In [4]: # 通过属性可以访问对象的数据 ZX.color Out[4]: 'red' In [5]: ZX.speed Out[5]: 0 In [6]: # 在 ZX 上调用 accelerate 方法 ZX.accelerate(20) In [7]: # ZX 的 speed 属性发生了改变 ZX.speed Out[7]: 20 In [8]: # YAMAHA 的 speed 属性保持不变 YAMAHA.speed Out[8]: 0

In [9]: ZX.color = "green"In [10]: ZX.colorOut[10]: 'green'In [11]: YAMAHA.color不变 Out[11]: 'blue'
C.2 使用带时区的 datetime 对象
In [12]: import datetime as dtfrom dateutil import tzIn [13]:不带时区的 datetime 对象 timestamp = dt.datetime(2020, 1, 31, 14, 30) timestamp.isoformat() Out[13]: '2020-01-31T14:30:00' In [14]: # 带时区的 datetime 对象 timestamp_eastern = dt.datetime(2020, 1, 31, 14, 30, tzinfo=tz.gettz("US/Eastern")) # 以isoformat格式打印可以更清楚地看出和UTC的差距 timestamp_eastern.isoformat() Out[14]: '2020-01-31T14:30:00-05:00' In [15]: # 为不带时区的datetime对象赋予时区 timestamp_eastern = timestamp.replace(tzinfo=tz.gettz("US/Eastern")) timestamp_eastern.isoformat() Out[15]: '2020-01-31T14:30:00-05:00' In [16]: # 转换时区 # 由于 UTC 时区很常用,因此可以简写为 tz.UTC timestamp_utc = timestamp_eastern.astimezone(tz.UTC) timestamp_utc.isoformat() Out[16]: '2020-01-31T19:30:00+00:00' In [17]: # 带时区转换为不带时区 timestamp_eastern.replace(tzinfo=None) Out[17]: datetime.datetime(2020, 1, 31, 14, 30) In [18]: # 不带时区的当前时间 dt.datetime.now() Out[18]: datetime.datetime(2021, 1, 3, 11, 18, 37, 172170) In [19]: # UTC时区中的当前时间 dt.datetime.now(tz.UTC) Out[19]: datetime.datetime(2021, 1, 3, 10, 18, 37, 176299, tzinfo=tzutc())

提示:Python 3.9 中的时区处理
Python 3.9 通过 timezone 模块为标准库添加了对时区的完全支持。
可以用它来代替 dateutil 的 tz.gettz 调用。
from zoneinfo import ZoneInfotimestamp_eastern = dt.datetime(2020, 1, 31, 14, 30,tzinfo=ZoneInfo("US/Eastern"))
C.3 可变和不可变的 Python 对象
在 Python 中,可以修改其值的对象称为可变的(mutable),而不能修改的就称为不可变的 (immutable)。
表 C-1 展示了各个数据类型属于哪一类。

了解两者之间的差别是很重要的,因为可变对象可能和你在其他语言(包括 VBA)中习以为常的东西有不一样的行为。
来看看下面这段 VBA 代码:
Dim a As Variant, b As Varianta = Array(1, 2, 3)b = aa(1) = 22Debug.Print a(0) & ", " & a(1) & ", " & a(2)Debug.Print b(0) & ", " & b(1) & ", " & b(2)
打印的结果如下:
1, 22, 31, 2, 3
现在在 Python 中用列表完成同样的操作:
In [20]: a = [1, 2, 3]b= aa[1] = 22print(a)print(b)[1, 22, 3][1, 22, 3]
In [21]: a = [1, 2, 3]b = a.copy()In [22]: aOut[22]: [1, 2, 3]In [23]: bOut[23]: [1, 2, 3]In [24]: a[1] = 22修改a…… In [25]: a Out[25]: [1, 22, 3] In [26]: b # ……不影响b Out[26]: [1, 2, 3]
In [27]: import copyb = copy.deepcopy(a)
C.3.1 以可变对象为参数调用函数
Function increment(ByRef x As Integer) As Integerx = x+ 1increment = xEnd Function
然后像下面这样调用这个函数:
Sub call_increment()Dim a As Integera = 1Debug.Print increment(a)Debug.Print aEnd Sub
上述代码会打印如下内容:
22
然而,如果你将 increment 函数中的 ByRef 改成 ByVal,则会打印出如下内容:
21
In [28]: def increment(x):x = x+ 1return xIn [29]: a = 1print(increment(a))print(a)21
In [28]: def increment1(x):x[0] = x[0] + 1return xIn [29]: a = [1]print(increment1(a))print(a)[2][2]
In [32]: a = [1]print(increment1(a.copy()))print(a)[2][1]

C.3.2 使用可变对象作为默认参数的函数
In [33]:不要这么做: def add_one(x=[]): # 这里的 x=[] 是赋值给了一个列表,而列表是可变量。 x.append(1) return x In [34]: add_one() Out[34]: [1] In [35]: add_one() Out[35]: [1, 1]
In [36]: def add_one1(x=None):if x is None:x = []x.append(1)return xIn [37]: add_one1()Out[37]: [1]In [38]: add_one1()Out[38]: [1]


感谢各位看到这里,欢迎关注、点赞、分享和评论,愿职场之神眷顾您,工作顺心如意,事业步步高升!未来的每一年,收入年年翻倍!
以上就是今天给你分享的内容,觉得有用的话欢迎点赞收藏哦!
如果你也对Python这门编程感兴趣的话,欢迎加入我们。(小白也可以参加)
资料获取方式:
点赞+再看,关注下方公众号↓↓↓↓,后台发送:“111” 即可领取资料学习编程
夜雨聆风