各位好,我们继续Python的学习。
上一篇,我们一起了解了Python的列表,字典等循环处理,想必大家已经学习到了,也体会到Python的简洁优雅。
下面,我们一起继续学习Python的迭代器Iteration,使用它来进行遍历数据结构。
For与迭代器
我们已经学习完了Python基础,对列表List的迭代非常容易。Python开发者通常使用for循环。现在就开始一段代码:
bookshelf = [
"传习录",
"禅与摩托车修理技术",
"Python 从Zero到Hero",
"从零到一",
""
]
for book in bookshelf:
print(book)
现在我们将书架上的每本书,把它们的名字都依次打印了出来,非常简单直观,这就是Python的趣处。
对于Hash散列类数据结构 ,依然可以使用for循环,但我们得用到键(Key)。来看如下的代码:
dictionary = { "some_key":"some_value" }
for key in dictionary:
print("%s --> %s" %(key, dictionary[key]))
#some_key --> some_value
上面就是如何使用散列数据结构的例子。对于dictionary中的每个key,我们可以通过print key和值的方式打印出来。
我们还有一种方法是使用 iteritems方法。代码请看如下:
dictionary = { "some_key":"some_value" }
for key, value in dictionary.items():
print("%s --> %s" %(key, value))
# some_key --> some_value
上面这个例子的结果是一样的。
另外,聪明的你可能看到,我们在print语句中把两个参数命名为key和value,通过字面意思是键/值,但并不是必须叫这个名字,我们可以给它们起任意喜欢的名字。请看以下代码:
dictionary_ex = {
"name": "Raymond",
"nickname": "Luoyi",
"nationality": "China",
"age": 38
}
for attribute, value in dictionary_ex.items():
print("My%s is %s" %(attribute, value))
# My name is Raymond
# My nickname is Luoyi
# My nationality is China
# My age is 38
您可以看到,我们使用attribute做为Dictionary键的参数,它也能够正常工作。是不是很棒呢!
类与对象
人类需要对象。对象就像是汽车、猫或自行车、洗衣机等等真实物体的表示。这些对象们共享两个主要特征:数据和行为。
汽车有数据,比如车轮数量,车门和座位数量,它还能够表现出来行为:可以加速、倒车、停止,显示还剩多少燃料,以及其它更多事情。
我们将数据识别为属性、行为和方法,这就称为面向对象编程。即:
数据->属性和行为->方法
类是创建一个对象的蓝图。在现实世界中,我们经常发现很多相同类型的对象,比如汽车,所有相同的品牌和型号都有一个引擎、车轮、车门等。每辆车都由同一序列蓝图构成的,并具有类似的组件。
Python面向对象编程模式:ON
和其它所有的面向对象编程语言一样,Python也有类和对象的概念。
一个类是一个蓝图,一个模型针对一个对象。
请让我再啰嗦一次。一个类只是一个模型,或者一个方法对定义属性或行为(就像我们本节第一段提到的理论)。例如,一个汽车的类它有自己的属性,定义什么样的对象是车。车轮的数量,汽车类型,座位数以及最高时速都是车的属性。
综合以上之思想,我们来看Python里声明类的语法:
class Vehicle:
pass
我们用class语法来声明一个类Vehicle。就是这样,是不是很简单?
对象是类的一个实例。我们创建一个类的实例:
car = Vehicle()
print(car) #
这里car就是一个对象,是类Vehicle的实例。
你应该会记得,我们的车辆具有4个属性:车轮数量、车辆类型、座位数量以及最高时速等。
因此,我们创建车辆类时,我们设置了这些属性。我们定义类可以来接收这些数据,并进行初始化。如下之代码:
class Vehicle:
def __init__(self, number_of_wheels, type_of_tank, seating_capacity,maximum_velocity):
self.number_of_wheels = number_of_wheels
self.type_of_tank = type_of_tank
self.seating_capacity = seating_capacity
self.maximum_velocity = maximum_velocity
在这里我们使用了init方法,在Python中将此名称的方法称为构造方法。当我们创建车辆对象时,我们就可以实例化一些属性。比如我们都喜欢Tesla Model S,也非常想拥有这种类型的车对象,它有4个轮子,以电池驱动,空间有5个座位,最高时速为250公里/小时。那么,让我们来创建这个车对象。
tesla_model_s = Vehicle(4, 'electric', 5,250)
即4轮,电动,5座,250公里/小时。
到此,Vehicle类的全部属性都已设置。但是我们的方法如何引用这些属性的值呢?
我们发送消息给对象,请它告诉我们属性的值。这种方法调用,被称为对象的行为。我们继续代码实现之:
class Vehicle:
def __init__(self, number_of_wheels, type_of_tank, seating_capacity,maximum_velocity):
self.number_of_wheels = number_of_wheels
self.type_of_tank = type_of_tank
self.seating_capacity = seating_capacity
self.maximum_velocity = maximum_velocity
def number_of_wheels(self):
return self.number_of_wheels
def set_number_of_wheels(self, number):
self.number_of_wheels = number
各位可以看到,有两个方法被定义了,分别为number_of_wheels和set_number_of_wheels。我们称之为getter和setter,一个是用来获取属性的值,一个是为属性设置一个新值。
在Python中,我们可以用@property(修饰符)来实现getters和setters。请看以下代码:
class Vehicle:
def __init__(self, number_of_wheels, type_of_tank, seating_capacity,maximum_velocity):
self.number_of_wheels = number_of_wheels
self.type_of_tank = type_of_tank
self.seating_capacity = seating_capacity
self.maximum_velocity = maximum_velocity
@property
def number_of_wheels(self):
return self.number_of_wheels
@number_of_wheels.setter
def number_of_wheels(self, number):
self.number_of_wheels = number
接下来,我们可以调用这些方法,让它们引用或设置属性。代码如下:
tesla_model_s = Vehicle(4, 'electric', 5,250)
print(tesla_model_s.number_of_wheels) # 4
tesla_model_s.number_of_wheels = 2 #setting number of wheels to 2
print(tesla_model_s.number_of_wheels) # 2
这和定义普通方法有些不一样,这些方法是为属性工作的。比如,当我们设置新的车轮数量时,我们不会使用两个参数,而是设置值2给number_of_wheels。
这是在Python中使用getter和setter的其中一种编码方法。还有其它方法,比如“make_noise”方法。我们来看这一段代码:
class Vehicle:
def __init__(self, number_of_wheels, type_of_tank, seating_capacity,maximum_velocity):
self.number_of_wheels = number_of_wheels
self.type_of_tank = type_of_tank
self.seating_capacity = seating_capacity
self.maximum_velocity = maximum_velocity
def make_noise(self):
print('VRUUUUUUUM')
当我们调用这个方法,它会返一个字符串“VRRRRUUUUM”。
tesla_model_s = Vehicle(4, 'electric', 5,250)
tesla_model_s.make_noise() # VRUUUUUUUM
接下来的内容,我们继续来掌握如何将对象中数据和方法进行隐藏,这被称之为“封装”,然后还有一起学习“继承”的概念,都是挺有趣的事情,值得共同期待。
作者:21CTO社区
说明:本站Python开发系列文章之连载。
领取专属 10元无门槛券
私享最新 技术干货