Python从Zero到Hero(二)

各位好,我们继续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开发系列文章之连载。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180114B0OFV100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券