查看原文
其他

Python从Zero到Hero(二)

21CTO 21CTO 2020-11-17

各位好,我们继续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) #<__main__.Vehicle instanceat 0x7fb1de6c2638>

 

这里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开发系列文章之连载。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存