EP36-zake学Python

223 阅读11分钟

1,基本语法

参考文档:

1,python解释器

1,命令行输入输出

2, 标准数据类型

python3有六个标准的数据类型:数字,字符串,列表,元祖,集合,字典。这六种数据类型可以分为两类:

  • 不可变数据:数字,字符串,元祖
  • 可变数据:列表,字典,集合

1,数字

1,整数

python可以处理任意大小的整数,

2,小数

小数也称为浮点数,是因为按照科学技术法表示时,一个浮点数的小数点的位置是可变的。
整数和小数在计算机内部的存储方式是不同的,整数运算永远是准确的,而浮点数的运算可能会有误差。

3,布尔值

一个布尔类型的变量只可能有两种值:True或者False.
布尔值可以用 and , or 或者 not运算。

4,复数
5,数字和字符串拼接会出现类型错误

使用 str()将数字转为字符串,再进行拼接。

2,字符串

转义字符可以转义很多字符,比如\n表示换行,\t表示制表符,
如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,python允许使用r''表示r右边的字符串里面的内容默认不转义。

>>> print('\\\t\\')
\       \
>>> print(r'\\\t\\')
\\\t\\
1,字符编码

ASCII编码:一个字节。
GB2312: 两个字节,
Unicode编码:Unicode编码标准的实现-》UTF-8。UTF-8编码是可变长的,UTF-8编码会把Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母编码为一个字节,汉字通常是3个字节,只有很生僻的字符才会编码为4-6个字节。

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘中或者需要传输的时候,就转换为UTF-8编码。

2,python的字符串

在python3中,字符串是以Unicode编码的,python的字符串支持多语言。
对于单个字符的编码,python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符。

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
3,字符串的常用方法
title()

以首字母大写的方式显示每个单词,不改变原字符串

upper()

将字符串中的所有字符都改为大写,不改变原字符串。

lower()

将字符串中的所有字符都改为小写,不改变原字符串。

使用 + 拼接字符串
使用制表符或者换行符来添加空白
>>> print('\tPython')
	Python
>>> print('Hello,\nPython')
Hello,
Python
删除空白

3,元组

元组与列表类似,不同之处在于元组的的元素不能修改,元组写在小括号内,元素之间用逗号隔开。
元组的元素类型也可以不相同。

4,列表

列表是python中使用最频繁的数据类型。列表内的元素类型可以不相同,支持数字、字符串甚至可以包含列表。
和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。 列表截取的语法:

变量[头下标:尾下标]
1,列表的常见操作
在列表末尾添加元素
append()
在列表的指定位置插入元素
>>> list.insert(1, 'hello')
>>> list
['nihao', 'hello', 'heihei', 'hehe', 'wa']
删除元素

5,字典

列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典中的元素是通过键来存取的,而不是通过偏移存取。
字典采用大括号。
数据存入dict的方法:

  • 初始化
  • 通过key放入,由于一个key只能对应一个value值,多次对一个key放入值会把前面的值冲掉。如果key不存在,就会报错。

6,集合

集合是由一个或者数个形态各异的大小整体组成的,构成集合的事物或者对象称作元素或是成员。
基本功能是进行成员关系测试和删除重复元素。
集合和字典类似,也是一组key的集合,但不存储value。 要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}

重复元素在set中被自动过滤。
通过add(key)方法可以添加元素到set中,可以重复添加,但没有实际作用。

5,空值

空值是python里面的一个特殊的值,用None表示。

3,变量

变量名必须是大小写英文字母,数字和_的组合,但是不能用数字开头。

4,常量

常量就是不能变得变量。在python中,通常用全部大写的变量名表示常量。

5,函数

函数参数

默认参数

默认参数必须指向不变对象。

可变参数
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

*将numbers转换为一个元组。

关键字参数

关键字参数允许你传入0个或者任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个字典。

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
命名关键字参数

限制关键字参数的名字:

def person(name, age, *, city, job):
    print(name, age, city, job)

6,高级特性

迭代

使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行。
如何判断一个可迭代对象: 通过collections模块的iterable类型判断。

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

列表生成式

可以用来创建list。

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

生成器

在python中,使用了yield的函数称为生成器。
与普通函数不同的是,生成器是一个返回迭代器的函数,简单理解生成器就是迭代器。
在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行的next()方法时,从当前位置继续执行。

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()
# 0 1 1 2 3 5 8 13 21 34 55

迭代器

可以直接作用于for循环的对象称为可迭代对象:Iterable
一类是集合数据类型:list,tuple,dict,set,str.
一类是生成器。
可以使用isinstance()判断一个对象是否是Iterable对象:

>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用isinstance()判断一个对象是否Iterator对象。

>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

7,函数式编程

通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解为简单任务,这种分解可以称之为面向过程的程序设计。函数是面向过程的程序设计的基本单元。

1,高阶函数

把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

匿名函数

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数的限制:只能有一个表达式,不用谢return,表达式就是返回值。

装饰器

由于函数也是一个对象,而且函数对象可以被赋值给变量,所以可以通过变量调用函数。

>>> def now():
...     print('2015-3-25')
...
>>> f = now
>>> f()
2015-3-25

函数对象有一个__name__属性,可以获取函数的名称。
如果要增强now函数的功能,在函数调用前后打印日志,但是又不想修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为装饰器。

偏函数

python的functools模块提供了很多有用的功能,其中包括偏函数(Partial function).

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

functools.partial的作用就是,把一个函数的某些参数固定住(设置默认值),返回一个新的函数。

8,模块

在python中,一个.py就是一个模块。
为了避免模块名字冲突,python通过包来组织模块,包的文件结构如下:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

每一个包目录下都会有一个__init__.py文件,这个文件时必须存在的,否则,python会将这个目录当成普通的目录,而不是一个包。

__name__属性

def fun():
    print 'This is function'
if __name__ == '__main__':
    fun()
    print 'This is main'

当导入到其他模块时,__name__的名字是导入模块的名字,当该文件独立运行时,__name__的名字是__main__.

9,面对对象编程

访问控制

如果要让内部属性不被外部访问,可以在属性前面加上两个下划线(__),就使得属性变为了一个私有变量。
但是,在python中,使用双下划线开头并且双下划线结尾的变量,例如: __xxx__,称之为特殊变量,特殊变量是可以直接访问的。
以一个下划线开头的变量,例如: _xxx,虽然可以在实例外被访问,但是应该被视作私有变量,不在实例外面访问。

获取对象信息

  • 使用type() 基本类型都可以用type()判断。
  • 使用isinstance()
  • 使用dir() 获取到一个对象的所有属性和方法,返回一个包含字符串的list,

实例属性和类属性

由于python是动态语言,根据类创建的实例可以任意绑定属性。
相同名称的实例属性将屏蔽类属性。

使用__slots__

动态语言可以在运行时给对象实例添加属性和方法,但是只对该属性起作用。
为了给所有实例添加方法,可以给类添加方法。

>>> def set_score(self, score):
...     self.score = score
...
>>> Student.set_score = set_score

可以使用__slots__限制实例能够添加的属性。

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

__slots__定义的属性只对当前实例起作用,对继承的子类不起作用。

多重继承

通过多重继承,一个子类可以同时获得多个父类的所有功能。
在设计类的继承关系时,通常主线都是单一继承下来的,让一个类在继承A类的同时,再继承B类,这种设计称为Mixin

定制类

python的class中有许多特殊用途的函数,可以用来定制类。

__str__()

定制实例输出。

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return 'Student object (name: %s)' % self.name
...
>>> print(Student('Michael'))
Student object (name: Michael)

直接敲变量,不使用print,调用的方法是__repr__(),该方法是为调试服务的。可以用如下方法解决:

class Student(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return 'Student object (name=%s)' % self.name
    __repr__ = __str__
__iter__()

定制类可以用于for循环,必须定义一个__iter__()方法。

使用枚举类

每个常量都是枚举类的唯一实例。

from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

10,python3内置函数

range()

range()函数返回的是一个迭代器对象,而不是列表类型,所以打印的时候不会打印列表。

>>>list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 2))
[0, 2, 4, 6, 8]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(1, 0))
[]

2,辅助工具

1,pip

1,升级pip

python -m pip install --upgrade pip或者 pip install -U pip

2,查看包的版本

//查看pip的版本
pip show pip

3,其他操作

  • 获取帮助 pip --help
  • 安装包
//默认安装最新版本
pip install somePackage
//指定版本
pip install somePackage==1.1.1

  • 升级包
pip install --upgrade somePackage

也可以通过==,>=,<=,>,<来指定一个版本号。

  • 卸载包
pip uninstall somePackage
  • 显示安装包的信息
pip show somePackage
  • 显示安装包的详细信息
pip show -f somePackage
  • 查找包
pip search Django
  • 使用清华大学的镜像站下载包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

3,查看pip是否安装

//python2.x版本
pip --version
//python3.x版本
pip3 --version

2,python

//查看Python版本
python -V
//退出python命令行
Ctrl-z  或者 exit() 
//进入python交互界面
python

查看某个内置函数的功能

# XXX为想要了解的函数名称
help(xxx)

3,《Effective Python》

image.png

4,《Python Cookbook》

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png