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)