想对python进行一次梳理,于是读《Python语言及其应用》部分章节,并记录于此。


目录:

  1 Python初探

  2 Python基本元素:数字、字符串和变量

    2.1 变量、名字和对象

    2.2 数字

    2.3 字符串

  3 Python容器:列表、元祖、字典与集合

    3.1 列表和元祖

    3.2 列表

    3.3 元祖

    3.4 字典

    3.5 集合

   4 Python外壳:代码结构

    4.5 使用for迭代

    4.6 推导式

    4.7 函数

    4.8 生成器

    4.9 装饰器

   5 Python盒子:模块、包和程序

    5.3 模块和import语句

    5.4 包

  6 对象和类

    6.2 使用class定义类

    6.3 继承

    6.6 使用super从父类得到帮助

    6.8 使用属性对特性进行访问和设置

    6.9 使用名称重整保护私有特性

    6.10 方法的类型


 

1 Python初探

 

2 Python基本元素:数字、字符串和变量

  2.1 变量、名字和对象

  • 变量名仅能包含字母、数字、下划线,只能以字母、下划线开头

  2.2 数字

  • 幂运算:2 ** 3 = 8
  整数
  • divmod(a, b),得元组(商,余数)
  基数
  • 0b、0B表二进制
  • 0o、0O表八进制
  • 0x、0X表十六进制
  类型转换
  • 强制类型转换:int(a), str(a), float(a). 特别地:int强制转换字符串时,只能转换仅含一个整数的字符串如‘23’,‘23.1’、‘1e4'等非整数不行
  • 一个int型有多大
  • python2中int型32位,long64位;python3中无long型,int型可存储超过64位

  2.3 字符串

  使用引号创建
  • 用一对单引号、双引号、三元引号(用于创建多行字符串,保留换行和空格)创建字符串
  • python允许创建空字符串
  使用转义
  • 在字符串中用转义字符表示单双引号,\'、\"
  使用分片
  • 字符串不可变,无法在原字符串中插入字符或改变指定位置字符
  • [start: end: step]分片,从start到end -1
  • 分片时小于起始位置偏移量当做0,大于终止位置偏移量当做-1
  使用split()分割
>>>todos = 'get gloves, get mask'
>>>todos.split(',')
['get gloves', 'get mask']
  • 若不制定分隔符,split()将默认使用空白字符—换行符、空格、制表符
  使用join()合并
>>>c_list = ['Yeti', 'Bigfoot', 'Loch Ness Monster']
>>>c_string = ','.join(c_list)
'Yeti, Bigfoot, LOCH Ness Monster'
  熟悉字符串
>>> poem = '''All that doth flow we cannot liquid name
or else would fire and water be the same;'''

>>>#poem第一次出现单词or的位置
>>>poem.find('or')
41

>>>#最后一次出现or的位置
>>>poem.rfind('or')
41

>>>#or在poem中共出现几次
>>>poem.count('or')
1
  大小写与对齐方式
>>>setup = 'a duck goes into a bar...'

>>>#删除字符串收尾的'.'
>>>setup.strip('.')
'a duck goes into a bar'

>>>#字符串首字母变成大写
>>>setup.capitalize()
'A duck goes into a bar...'

>>>#所有单词开头变成大写
>>>setup.title()
'A Duck Goes Into A Bar...'

>>>#所有字母变成大写
>>>setup.upper()
'A DUCK GOES INTO A BAR...'

>>>#所有字母变成小写
>>>setup.lower()
'a duck goes into a ba..'
  使用replace()替换
  • 使用replace()函数可以进行简单子串替换,需传入参数包括:需替换的、新的、替换多少处(默认1)
>>>setup.replace('duck', marmoset')
'a marmoset goes into a bar...'

 

3 Python容器:列表、元祖、字典与集合

  3.1 列表和元祖

  3.2 列表

>>>marxes = ['Groucho', 'Chico', 'Harpo']
>>>others = ['Gummo', 'Karl']

>>>#使用append()添加元素至尾部
>>>marxes.append('Zeppo')
['Groucho', 'Chico', 'Harpo', 'Zeppo']

>>>#使用extend()或+=合并列表
>>>marxes.extend(others)
['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo', 'Karl']

>>>#使用insert()在制定位置插入元素
>>>marxes.insert(3, 'Gummo')
['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo']

>>>#使用del删除指定位置元素
>>>del marxes[-1]
['Groucho', 'Chico', 'Harpo', 'Gummo']

>>>#使用remove()删除具有指定值的元素
>>>marxes.remove('Gummo')
['Groucho', 'Chico', 'Harpo']

>>>#使用pop()获取并删除制定位置的元素(默认-1)
>>>marxes.pop()
'Harpo'
>>>marxes
['Groucho', 'Chico'']

>>>#使用index()查询具有特定值的元素位置
>>>marxes.index('Chico')
1

>>>#使用count()记录特定值出现的次数
>>>marxes.count(''Chico')
1

>>>#使用join()将列表转换为字符串
>>>','.join(marxes)
'Groucho, Chico'

>>>#使用sort()重新排列元素
>>>#列表方法sort()会对原列表进行排序,改变原列表内容
>>>#通用方法sorted()则会返回排好序的列表副本,原列表内容不变

>>>#使用len()获取列表长度

>>>#使用=赋值,使用copy()复制
>>>a = [1, 2, 3]
>>>b = a
>>>a[0] = 'change'
>>>a
['change', 2, 3]
>>>b
['change', 2, 3]

#b、d、d都是a的复制,会新创内存复制
>>>a =[1, 2, 3]
>>>b = a.copy()
>>>c = list(a)
>>>d = a[:]
>>>a[0] = 'change'
>>>a
['change', 2, 3]
>>>b
b = [1, 2, 3]
>>>c
c = [1, 2, 3]
>>>d
d = [1, 2, 3]

  3.3 元祖

  定义元祖真正靠的是每个元素后面的逗号(但如果习惯加一对括号也可以)

>>>#创建空元祖
>>>empty_tuple = ()
>>>empty_tuple
()

>>>#创建包含一个元素的元祖
>>>one_marx = 'Groucho',
>>>#等价于one_marx = ('Groucho',)
>>>one_marx
('Groucho',)

>>>#创建包含多个元素的元祖
>>>marx_tuple = 'Groucho', 'Chico', 'Harpo'
>>>marx_tuple
('Groucho', 'Chico', 'Harpo')

>>>#元祖解包(提取出字符串)
>>>a, b, c = marx_tuple
>>>a
'Groucho'
>>>b
'Chico'
>>>c
'Hamo'

  3.4 字典

  • 字典中的元素是0个或若干个键值对
  • 使用empty_dict = {}创建空字典
  • 可对任何包含双值子序列使用dict()转换为字典
>>>#包含双值元祖的列表:
>>>lot = [('a', 'b'), ('c', 'd'), ('e', 'f')]
>>>dict(lot)
{'c': 'd', 'a': 'b', 'e': 'f'}

>>>#包含双值列表的元祖
>>>tol = (['a', 'b'], ['c', 'd'], ['e', 'f'])
>>>dict(tol)
{'c': 'd', 'a': 'b', 'e': 'f'}

>>>#双字符的字符串组成的列表
>>>los = ['ab', 'cd', 'ef']
>>>dict(los)
{'c': 'd', 'a': 'b', 'e': 'f'}

>>>#双字符的字符串组成的元祖
>>>tos = ('ab', 'cd', 'ef')
>>>dict(tos)
{'c': 'd', 'a': 'b', 'e': 'f'}
  • 字典常用操作如下
>>>pythons = {'Chapman': 'Graham', 'Cleese': 'John', 'Idle': 'Eric'}

>>>#使用update()合并字典(相同的键对应的值会被取代)
>>>others =  {'Marx': 'Groucho', 'Idle': 'Moe'}
>>>pythons.update(others)
>>>pythons
{'Chapman': 'Graham', 'Cleese': 'John', 'Idle': 'Moe', 'Marx': 'Groucho'}

>>>#使用del删除具有指定建的元素
>>>del pythons['Marx']
>>>pythons
{'Chapman': 'Graham', 'Cleese': 'John', 'Idle': 'Moe'}

>>>#使用clear()删除所有元素
>>>pythons.clear()
>>>pythons
{}

>>>pythons = {'Chapman': 'Graham', 'Cleese': 'John', 'Idle': 'Eric'}

>>>#使用in判断键是否存在
>>>'Chapman' in pythons
True

>>>#使用[key]获取元素时,若不存在该key,会报错.避免这种情况,方法如下
>>>#方法1, 先用in判断是否存在,再取值
>>>#方法2, 使用pythons.get('Chapman')

>>>#使用keys()获取所有键
>>>pythons.keys()
dict_keys(['Chapman', 'Cleese', 'Idle'])

>>>#使用values()获取所有值
>>>pythons.values()
dict_values(['Graham', 'John', 'Eric'])

>>>#使用items()获取所有键值对
>>>pythons.items()
dict_items([('Chapman', 'Graham'), ('Cleese', 'John'), ('Idle', 'Eric')])
>>>list(pythons.items())
[('Chapman', 'Graham'), ('Cleese', 'John'), ('Idle', 'Eric')]

>>>#使用=赋值,使用copy()复制,与列表同理

  3.5集合

>>>#使用set()创建集合
>>>empty_set = set()
>>>empty_set
set()

>>>#set()将其他类型转换为集合
>>>set('letters')
{'l', 'e', 't', 'r', 's'}
>>>set(['Dasher', 'Dancer', 'Prancer'])
{'Dasher', 'Dancer', 'Prancer'}

>>>#建立一个叫drinks的字典,对应的value为饮料的成分
>>>drinks = {
                    'martini': {'vodka', 'vermouth'},
                    'black russian': {'vodka', 'kahlua', 'vodka'},
                    'white russian': {'cream', 'kahlua', 'vodka'},
                    'manhattan': {'rye', 'vermouth', 'bitters'},
                    'screwdriver': {orange juice', 'vodka'}
                    }

>>>#哪种饮料含有伏特加
>>>for name, contents in drinks.items():
...         if 'vodka' in contents:
...             print(name)
screwdriver
martini
black russian
white russian

>>>#含有伏特加,但不含乳糖和艾酒
>>>for name, contents in drinks.items():
...         if 'vodka' in contents and not ('vermouth' in contents or 'cream' in contents):
...             print(name)
screwdriver
black russian

>>>#合并及运算
>>>a = {1, 2}
>>>b = {2, 3}
>>>#得到两个集合共有的元素
>>>a & b
{2}

#取并集
>>>a | b
{1, 2, 3}

 

4 Python外壳:代码结构

   4.5 使用for迭代

    字符串、列表、元组、字典、集合等都是可迭代的对象

    对一个字典直接进行迭代,返回字典的键

    使用zip()函数配对

>>>english= ‘Monday', 'Tuesday', 'Wednesday'
>>>french = 'Lundi', 'Mardi', 'Mercredi'

>>>list( zip(english, french) )
[('Monday', 'Lundi'), ('Tuesday', 'Mardi'), ('Wednesday', 'Mercredi')]

>>>dict( zip(english, french) )
{'Monday': 'Lundi', 'Tuesday': 'Mardi', 'Wednesday': 'Mercredi'}

    range()函数返回在特定区间的自然数序列,start默认为0,stop必须指定,step默认为1

   4.6 推导式

  • 列表推导式
>>>#[expression for item in iterable]
>>>number_list = [number - 1 for number in range(1, 6) if number % 2 == 1]
>>>number_list
[0, 2, 4]
  • 字典推导式
  • 集合推导式
  • 元组没有推导式,将列表推导式中的方括号变成圆括号形成生成器

   4.7 函数

  • 默认参数值在函数被定义时已经计算出来。我们经常犯的一个错误是把可变的数据类型(例如列表或者字典)当作默认参数值
#buggy定义时这里的空列表已分配出来
>>>def buggy(arg, result=[]):
...       result.append(arg)
...       print(result)

>>>buggy('a')
['a']
>>>buggy('b')
['a', 'b']
  • 使用*收集位置参数
>>>#当参数被用在函数内部,星号将一组可变数量的位置参数集合成参数值的元组
>>>def print_args(*args):
...        print('include:', args)
>>> print_args(3, 2, 1, 'wait')
inlcude: (3, 2, 1, 'wait')
  • 使用**收集关键字参数
>>>#使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字典的值
>>>def print_kwargs(**kwargs):
...        print('include:', kwargs)
>>>print_kwargs(wine='merlot', entree='mutton')
include: {'wine': 'meriot', 'entree': 'mutton'}
  • 闭包
>>>#内部函数
>>>def knights(saying):
...        def inner(quote):
...            return "say: '%s'" % quote
...        return inner(saying)

>>>#闭包
>>>#inner2()直接使用外部的saying参数,而不是通过另外一个参数获取
>>>#knights2()返回值为inner2函数,而不是调用它
>>>def knights2(saying):
...        def inner2():
...            return "say: '%s'" % saying
...        return inner2

>>>a = knights2('Duck')
>>>a()
"say: 'Duck'"
  • 匿名函数:lambda()函数
func = lambda word: word.capitalize()

   4.8 生成器

   4.9 装饰器

  • 不改变源代码的情况下修改已存在的函数
>>>#定义一个装饰器
>>>def square_it(func):  #输入参数为函数
...        def new_function(*args, **kwargs):  #*args **kwargs提取所有参数
...            result = func(*args, **kwargs)  #调用func得到其返回值
...            return result ** 2  #装饰器处理func返回值
...        return new_function  #闭包

>>>#用装饰器装饰一个函数
>>>@square_it
...def add_ints(a, b):
...    return a + b

>>>add_ints(3, 5)
64

 

5 Python盒子:模块、包和程序

  5.3 模块和import语句

  • 一个模块仅是Python代码的一个文件

  5.4 包

  • 将多个功能相近模块组织成文件层次,称为包(如numpy是一个包)。包中必须包含__init__模块(可以为空)

6 对象和类

  6.2 使用class定义类

  • 类的定义中,__init__并不是必需的。只有当需要区分由该类创建的不同对象时,才需要指定__init__方法
class Persong():
    def __init__(self):
        pass

  6.3 继承

  • 在新类里面定义额外需要的方法(与父类不一样的方法名),或覆盖父类的方法(与需要覆盖的父类方法名同名)
class Car():
    pass

class Yugo(Car):
    pass

  6.6 使用super从父类得到帮助

  • 在子类中定义__init__方法时,父类的__init__方法会被覆盖。所以在子类中,弗雷德初始化方法若需要,要显示调用
class EmailPerson(Person):
    def __init__(self, name, email):
        super().__init__(name)  #不需再传入self参数
        self.email = email

  6.8 使用属性对特性进行访问和设置

  • 为对象编写setter和getter方法
>>>class Duck():
...        def __init__(self, input_name):
...            self.hidden_name = input_name

...        @property
...        def name(self):
...            print('inside the getter')
...            return self.hidden_name

...        @name.setter
...        def name(self, input_name):
...            print('inside the setter')
...            self.hidden_name = input_name

>>>fowl = Duck('Howard')
>>>fowl.name
inside the getter
'Howard'
>>>fowl.name = 'Donald'
inside the setter
>>>fowl.name
inside the getter
'Donald'

  6.9 使用名称重整保护私有特性

  • Python对那些需要刻意隐藏在类内部的特性有自己的命名规范:由连续的两个下划线开头'__'
#这样就不能在类外直接调用 对象.__name
>>>class Duck():
...    def __init__(self. input_name):
...        self.__name = input_name
        ...

  6.10 方法的类型

  • 实例方法:首个参数为self
  • 类方法:首个参数为cls,用前缀修饰符@classmethod指定
  • 静态方法:参数无要求,用前缀修饰符@staticmethod指定

 

8 数据的归宿

  8.1 文件输入/输出

  • fileobj = open(filename, mode)将文件指针载入内存,供读写调用。最后需要关闭文件

    1. mode的第一个字母表明对其的操作:

      r 表示读模式

      w 表示写模式。如果文件不存在则新创建,如果存在则重写新内容

      x 表示在文件不存在的情况下新创建并写内容

      a 表示如果文件存在,在文件末尾追写内容

    2. mode的第二个字母是文件类型::

      t(或省略不写) 代表文本类型

      b 代表二进制文件

  • 使用write()写文本文件
>>>poem = 'this is an example'
>>>#将其写入文件'relativity'中
>>>fout = open('relativity', 'wt')
>>>fout.write(poem)
19
>>>fout.close()