python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
另一个原因是 python 的编写使用方式有多种,数据科学、网页开发、机器学习皆可使用 python。quora、pinterest 和 spotify 都使用 python 作为其后端开发语言。
基础篇
变量
简单来讲,我们可以把变量看作是存储一个值的词。
在 python 中定义一个变量并为其赋值非常简单。想象一下你在变量「one」中存储 1,即是:
one = 1
这是多么简单,我们只要把 1 赋值给变量「one」。
two = 2 some_number = 10000
并且你可以把任意值赋给任意变量。如上所见,把整数 2 赋值给变量「two」,把 10,000 赋值给变量「some_number」。除了整数,我们也可以赋值布尔运算、字符串、浮点数以及其他数据形式。
# booleans true_boolean = true false_boolean = false
# string my_name = leandro tk
# float book_price = 15.80
控制流:条件语句
「if」语句通过表达式评估一个语句是真或假。如果是真,则向下执行「if」条件中的子语句。比如:
if true: print(hello python if) if 2 > 1: print(2 is greater than 1)
2 比 1 大,因此「print」代码被执行。如果「if」表达式是假的,则「else」下的子语句将被执行。
if 1 > 2: print(1 is greater than 2) else: print(1 is not greater than 2)
你也可以使用一个「elif」语句以添加一个执行条件。
if 1 > 2: print(1 is greater than 2) elif 2 > 1: print(1 is not greater than 2) else: print(1 is equal to 2)
循环/迭代器
在 python 中,我们可有不同形式的迭代。我将讨论两个:while 与 for。
while 循环:当该语句为真,以下代码将被执行,并打印从 1 到 10 的数字。
num = 1
while num value) 对用冒号 (**:**) 分割,每个对之间用逗号 (**,**) 分割,整个字典包括在花括号 (**{})**中。如下,字典(dictionary)是键(key)与值(value)的集合:
dictionary_example = { key1: value1, key2: value2, key3: value3 }
其中键是指向对应值的索引,我们需要使用键而访问对应的元素值:
dictionary_tk = { name: leandro, nickname: tk, nationality: brazilian }
print(my name is %s %(dictionary_tk[name])) # my name is leandro print(but you can call me %s %(dictionary_tk[nickname])) # but you can call me tk print(and by the way i'm %s %(dictionary_tk[nationality])) # and by the way i'm brazilian
以上创建了一个字典,其中定义了四个键与对应的值,print 函数内使用了字典的键以获取对应的值。此外,字典的值可以使用任何类型的数据,如下我们添加了一个键为字符型,值为数值型的键-值对。
dictionary_tk = { name: leandro, nickname: tk, nationality: brazilian, age: 24 }
print(my name is %s %(dictionary_tk[name])) # my name is leandro print(but you can call me %s %(dictionary_tk[nickname])) # but you can call me tk print(and by the way i'm %i and %s %(dictionary_tk[age], dictionary_tk[nationality])) # and by the way i'm brazilian
下面我们需要了解如何添加元素到字典中,其实字典的本质就是指向特定值的关键字的集合。因此我们可以直接将某个值赋予到字典某个关键字(可以不存在)中而修改或添加键值对。
dictionary_tk = { name: leandro, nickname: tk, nationality: brazilian }
dictionary_tk['age'] = 24
print(dictionary_tk) # {'nationality': 'brazilian', 'age': 24, 'nickname': 'tk', 'name': 'leandro'}
迭代:数据结构中的循环
列表循环同样十分简单,我们可以循环地修改或输出某个列表。如下,我们常用 for 循环依次提取列表中的元素:
bookshelf = [ the effective engineer, the 4 hours work week, zero to one, lean startup, hooked ]
for book in bookshelf: print(book)
对于哈希数据结构,我们同样可以使用字典中的键和 for 循环依次读取键与对应的值:
dictionary = { some_key: some_value }
for key in dictionary: print(%s --> %s %(key, dictionary[key]))
# some_key -->some_value
使用 iteritems 方法同样可以实现相同的效果:
dictionary = { some_key: some_value }
for key, value in dictionary.items(): print(%s --> %s %(key, value))
# some_key -->some_value
我们命名了两个参数 key 和 value,但我们同样可以命名为其它的,如下我们使用 attribute 和 value 作为字典键值的参数,它同样有效:
dictionary_tk = { name: leandro, nickname: tk, nationality: brazilian, age: 24 }
for attribute, value in dictionary_tk.items(): print(my %s is %s %(attribute, value))
# my name is leandro # my nickname is tk # my nationality is brazilian # my age is 24
进阶篇
类与对象
对象(object)表征的是真实世界中的目标,如狗、猫和自行车等,一般对象有两个特征,即数据(data)与行为(behavior)。对象「车辆」有一些数据,如车轮的数量、车门的数量与作为容量等,它同样还有一些行为,例如车辆可以加速、刹车、展示燃油使用量等。
在面向对象的编程中,我们将数据表示为属性,将行为表示为方法。
类(class)是创建独立对象的蓝图。在现实世界中,我们经常发现很多相同类型的对象。例如车辆,同型号的车辆都有引擎、车轮、座位等组件,而每一辆车都是根据相同的设计图构建且有相同的组件。
因此,对象是对客观事物的抽象,类是对对象的抽象。对象是类的实例,类是对象的模板。
python 是一种面向对象的程序语言,因此它也有类(class)与对象(object)这两个概念。在了解 python 面向对象编程的案例前,我们需要先熟悉面向对象编程的一些基本概念:
类 (class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,一个「狗」类的对象派生自「动物」类,这是模拟”是一个(is-a)”关系(狗是一种动物)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
下面首先查看通过声明定义类的语句:
class vehicle: pass
目标是类的实例,我们可以使用类的名称创建一个实例:
car = vehicle() print(car) #
如上,car 为 vehicle 类的一个对象或实例。
若我们的 vehicle 类有四个属性,即车轮数、储能类型、座位容量和最大时速,那么我们在创建 vehicle 类时可以设置这些属性。下面,我们定义了初始化类时所接受的数据。self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
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__() 方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建 vehicle 类的实例时就会调用该方法来定义这些属性。若我们希望能创建 tesla model s 这一个对象,根据其有四个车轮、电力驱动、四座容量和最大时速为 250km/hour 的特征,我们能创建对象:
tesla_model_s = vehicle(4, 'electric', 5, 250)
现在所有的属性已经设定了,那么我们该如何访问这些属性值?我们将发送信息到对象的过程称为方法,即对象的行为:
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,因为第一个方法获取了属性值,而第二个方法将为该属性设置一个新的值。在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数。
在 python 中,我们能使用 @property (decorators) 定义 getter & setter:
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
这和定义方法有一些不同,这些方法作为了一种属性。如上当我们设定新的车�...