published on in Python

初学篇・面向对象&数据结构

返回教程主页

上篇 初学篇・函数的定义与调用

在Python当中,我们常常使用到的基本数据类型有整型int、浮点型float、字符串类型str……,以及结构类型列表list、元组tuple,事实上我们也可以自己来定义类型,这将涉及到Python的面向对象编程。

类的定义与实例化

我们可以借助关键字class定义我们自己的数据结构类型:

class <类名称>:
    <类成员>

在完成类的定义后我们可以借助类名称来实例化我们的类型,即产生一个该类型的对象:

class Calc:
    pass # pass 用于占位,并无具体操作
    
calc = Calc()
print(type(calc))

运行结果:

<class 'pythonTmp.Calc'>

我们可以在类中定义一些变量作为该类的成员变量,并且使用点.进行调取:

class Number:
    one = 1
    two = 2
    pi = 3.14159

number = Number()
print(number.one, number.two, number.pi)

运行结果:

1 2 3.14159

我们也可以在类中定义一些函数作为该类的成员方法,并使用点.进行调用:

class Computer:
    def add(self, a, b):
        return a + b
    
    def sub(self, a, b):
        return a - b
        
computer = Computer()
print(computer.add(100, 100))
print(computer.sub(100, 100))

运行结果:

200
0

成员方法的第一个参数代表该对象本身,通常取名self,调用某对象的成员方法时该参数无须设定。借助这个参数,我们可以在某个成员方法中操作其它该类的成员变量或成员方法:

class Man:
    name = "kk"
    
    def say(self):
        print("I'm", self.name)

man = Man()
man.say()

运行结果:

I'm kk

构造方法

实例化类的时候会调用到该类的构造方法__init__,如果编码人员没有自己设定Python将启用默认的设定。借助构造方法我们可以在实例化类的时候传入参数:

class MyClassOne:
    def __init__(self):
        print('New a object')

mc1 = MyClassOne()

class MyClassTwo:
    def __init__(self, message):
        print(message)
        
mc2 = MyClassTwo('Init message')

运行结果:

New a object
Init message

在构造方法中使用self参数设置类的成员:

class Man:
    def __init__(self, name):
        self.name = name
        
    def say(self):
        print("I'm", self.name)

man = Man("jojo")
man.say()

运行结果:

I'm jojo

序列结构类型

Python当中最常用的序列结构类型就是: 列表list、元组tuple、字符串str,除了遍历的方法,我们也可以通过下标索引的方式将序列结构中的元素取出:

a = [1, 2, 3]
print(a[0], a[1], a[2])
b = (1, 2, 3)
print(b[0], b[1], b[2])
c = "123"
print(c[0], c[1], c[2])

运行结果:

1 2 3
1 2 3
1 2 3

索引对象时需要注意: Python中的下标从0开始计数,也就是下标0的位置其实是序列的第一个:

print('abcdefg'[0])
print((5, 4, 3, 2, 1)[0])
print([-1, -2, -3, -4, -5][0])

运行结果:

a
5
-1

列表与元组和字符串有一个比较大的区别就是列表中的元素允许被修改:

_list = [0, 0, 0]
print(_list)
_list[0] = 1
print(_list)
_list[1] = 2
print(_list)
_list[2] = 3
print(_list)

运行结果:

[0, 0, 0]
[1, 0, 0]
[1, 2, 0]
[1, 2, 3]

Python中可以使用切片slice的方法来取得序列结构中的某一部分:

_str = "123456789"
print(_str[0:3])
_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9)
print(_tuple[1:4])
_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(_list[2:5])

运行结果:

123
(2, 3, 4)
[3, 4, 5]

切片索引具有以下形式:

  • [n:]: 取序列第n个到最后一个;
  • [:n]: 取序列第0个到第n-1个;
  • [a:b]: 取序列第a个到第b-1个;
  • [n::s]: 从序列第n个开始到序列最后,每跨s个元素进行取出;
  • [:n:s]: 从序列第0个开始到第n-1个,每跨s个元素进行取出;
  • [a:b:s]: 从序列第a个开始到第b-1个,每跨s个元素进行取出;
sequence = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(sequence[1:9:2])

运行结果:

[2, 4, 6, 8]

Python当中的索引可以使用负数来表示倒数开始的位置,例如最后一位[-1]:

word = "sequnece"
print(word[-1])
print(word[-2])
print(word[-3])

运行结果:

e
c
e

可以使用列表listappend成员方法动态的为列表加入新的元素:

_list = []
print(len(_list), _list)
_list.append(1)
print(len(_list), _list)
_list.append(2)
print(len(_list), _list)

运行结果:

0 []
1 [1]
2 [1, 2]

集合结构

Python还支持集合set类型。集合是由不重复元素组成的无序容器。基本用法包括成员检测、消除重复元素。集合对象支持合集、交集、差集、对称差分等数学运算。创建集合用花括号或set()函数,注意,创建空集合只能用set(),不能用{}:

set_a = {1, 2, 3}
print(set_a)
set_b = {2, 3, 4}
print(set_b)

运行结果:

{1, 2, 3}
{2, 3, 4}

字典结构

如果集合中的每一个元素都有自己对应的值,那么这种由集合与值映射所组成的结构就被称作字典dict,字典在定义时可以使用冒号:来指定对应关系,并且也支持索引、赋值、修改:

_dict = {'a': 1, 'b': 2, 'c': 3}
print(_dict)
print(_dict['a'])
print(_dict['b'])
print(_dict['c'])
_dict['a'] = 3
_dict['b'] = 2
_dict['c'] = 1
print(_dict)

运行结果:

{'a': 1, 'b': 2, 'c': 3}
1
2
3
{'a': 3, 'b': 2, 'c': 1}

下篇 初学篇・猜字游戏「阶段练习」