数据类型
- int - 整数
- float - 浮点数
- 布尔值 True or False
- 空值 None
None 在 Python 中是一个特殊的值,表示“无”。 - 元组(tuple)
我们是用逗号创建元组。在赋值语句的右边我们创建了一个元组,我们称这为元组封装(tuple packing),赋值语句的左边我们则做的是元组拆封 (tuple unpacking)。
%s 字符串(用 str() 函数进行字符串转换)
%r 字符串(用 repr() 函数进行字符串转换)
%d 十进制整数
%f 浮点数
%% 字符“%“
类型转换
关键字
变量
命名类似于
study='学习Python'
print(study)//打印
stydy=study//赋值
print(stydy)
给多个变量赋值
a,b=10,20 #a为10 b为20
a,b=b,a #a,b互相交换值
列表
它可以写作中括号之间的一列逗号分隔的值。列表的元素不必是同一类型。
a = [ 1, 342, 223, 'India', 'Fedora']
a
[1, 342, 223, 'India', 'Fedora']
#1.判断元素是否存在列表
'India' in a
True
5 in a
False
#2.内建函数len()返回列表长度
len(a)
#3.检查列表是否为空
if a
True #不为空
else
False #为空
a.append() #在列表末尾添加元素
a.insert() #在列表任意位置插入元素
a.count(s) #返回列表中元素s的数量
a.remove(s) #移除列表中任意值
a.reverse() #翻转列表
a.extend(b) #将列表b添加到列表a的末尾
a.sort() #给列表排序 但列表需是可比较的
del a[] #删除列表指定位置的元素
Input() 函数
主要作用是让用户输入某个内容并接收它 —— 比如注册时需要填写账号密码。
如果input()函数执行后,没有在后面输入内容,程序会一直卡住,等待输入信息。
语法为
test=input("study:")//括号内的自己输入
study : python //上方代码执行,弹出study:,输入python,等于给test赋值python。
print(test) //打印test
python
字典
字典是是无序的键值对(key:value)集合,同一个字典内的键必须是互不相同的。一对大括号 {} 创建一个空字典。初始化字典时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。使用键来检索存储在字典中的数据。
字符串
方法 title() 返回字符串的标题版本,即单词首字母大写其余字母小写。
方法 upper() 返回字符串全部大写的版本,反之 lower() 返回字符串的全部小写版本。
方法 swapcase() 返回字符串大小写交换后的版本。
方法 isalnum() 检查所有字符是否只有字母和数字。
方法 isalpha() 检查字符串之中是否只有字母。
使用 split() 分割任意字符串,split() 允许有一个参数,用来指定字符串以什么字符分隔(默认为 " "),它返回一个包含所有分割后的字符串的列表。
方法 join() 使用指定字符连接多个字符串,它需要一个包含字符串元素的列表作为输入然后连接列表内的字符串元素。
trip(chars),用来剥离字符串首尾中指定的字符,它允许有一个字符串参数,这个参数为剥离哪些字符提供依据。不指定参数则默认剥离掉首尾的空格和换行符。
可以使用 lstrip(chars) 或 rstrip(chars) 只对字符串左或右剥离。
find() 能帮助找到第一个匹配的子字符串,没有找到则返回 -1。
z = s[::-1] #把输入的字符串s 进行倒序处理形成新的字符串z
print('He said "Today's weather is good."')//打印出来是错误的
print('He said "Today\'s weather is good."')//在Today 后加上转义符\即无错误。添加转义符是告诉我们\后面的'是要打印的内容。
索引
字符串是一堆字符的集合,可以通过位置编号,来获得对应的字符。类似于数组里的编号。
索引除了是正数,也可以是 负值,表示倒数第几个。
format()函数
format() 是专门用来 格式化字符串 的函数,它最常用的功能就是「插入数据」和「数字格式化」。
- 插入数据
name = input('请输入姓名:')
age = input('请输入年龄')
//1.第一种写法 较麻烦且有局限性
print('你叫'+name+',今年' + age + '岁了')
//第二种写法 利用format函数
print('你叫{},今年{}岁了'.format(name,age))
{} 为占位符,意思是我先把这个位置占住,具体数据在后面导入。如以上代码name导入第一个占位符,age导入第二个占位符。
- 数字格式化
例:要输出圆周率,但只保留两位小数。
print("{:.2f}".format(3.1415926))
如果要保留三位,则改成 {:.3f};不带小数,则改成 {:.0f},依次类推。
{:x.af} 表示替换为x个字符宽度,保留a位小数。
注释
注释,可理解为程序的注解、提示,用来帮助他人和自己阅读、理解、编写代码。python中,# 常被用作写单行注释,# 号后的内容会被忽略,不会被当作代码处理。
算术运算符
比较运算符
赋值运算符
逻辑运算符
在逻辑运算中,数字 0 代表 False,1 代表 True。
条件判断
##if elif else后需要加冒号来告诉计算机这是一个判断语句
a = int(input("Please enter a number: "))
## 让用户输入一个数字,用变量 a 接受 用int()强换转化为整数 只有数字或纯数字才能转换
if a > 10: ##如果 a > 10,则执行内部的代码,反之跳过
print('a > 10')
## 请特别注意语句块内的空格缩进,请使用 4 个空格缩进。
elif a == 10: ##else if =elif
print('a == 10')
else:
print('a < 10')
在程序开发过程中,当遇到一些代码暂时不写(等到后面写),又不想程序在执行时报错的情况,可以使用 pass 关键字,程序执行遇到 pass 就会跳过这里的代码块继续执行后面的代码。
if a and b:
if:
else:
else:
if a or b:
if:
else:
else:
if not a
if:
else:
else:
循环
for循环
for 循环 主要用于,对一个范围内的每个元素,进行指定操作。
for item in list:
## item表示元素 list表示集合
range()函数
如果需要处理一组数字列表,并且数字列表满足一定的规律,可以使用 Python 的内置函数 range()(范围)。
使用 range(x) 函数,可以生成一个从 0 到 x-1 的整数序列。
## 例:打印0到9
for a in range(10):
print(a)
还可以用 range(a,b) 取某个区间的数。
##例:打印1到10 range(a,b)包头不包尾 所以需要给b加1
for a in range(1,11):
print(a)
while 循环
for 循环 适用于 已知循环次数 的循环,所以后面跟的是次数或区间,到达指定次数就停止。而未知循环次数就可以用while来解决。while 后面跟的是一个条件,只要条件满足,这个循环就会一直进行下去。
while a:
print('a')
break 和 continue
break 表示停止当前循环.。
continue 表示跳过当前循环轮次,去执行下一轮循环。
函数
定义函数
def 函数名(参数):
语句1
语句2
使用 global 关键字,将函数中的变量标志为全局变量,让函数内部使用全局变量。
默认参数值
def test(a , b=1): #b的默认值为1,若调用时未给出b的值,则为默认值
if a > b:
return True
else:
return False
具有默认值的参数后面不能再有普通参数。
默认值只被赋值一次,第二次使用时不再是原来的默认值。
关键字参数
函数可以通过关键字参数的形式来调用,形如 keyword = value。
强制关键字参数
我们也能将函数的参数标记为只允许使用关键字参数。用户调用函数时将只能对每一个参数使用相应的关键字参数。
文档字符串
在 Python 里我们使用文档字符串(docstrings)来说明如何使用代码,这在交互模式非常有用,也能用于自动创建文档。
高阶函数
高阶函数(Higher-order function)或仿函数(functor)是可以接受函数作为参数的函数:
- 使用一个或多个函数作为参数
- 返回另一个函数作为输出
Python 里的任何函数都可以作为高阶函数
map 函数
map 是一个在 Python 里非常有用的高阶函数。它接受一个函数和一个序列(迭代器)作为输入,然后对序列(迭代器)的每一个值应用这个函数,返回一个序列(迭代器),其包含应用函数后的结果。
文件操作
文件打开
使用 open() 函数打开文件。它需要两个参数,第一个参数是文件路径或文件名,第二个是文件的打开模式。模式通常是下面这样的:
- “r”,以只读模式打开,你只能读取文件但不能编辑/删除文件的任何内容
- “w”,以写入模式打开,如果文件存在将会删除里面的所有内容,然后打开这个文件进行写入
- “a”,以追加模式打开,写入到文件中的任何数据将自动添加到末尾
默认的模式为只读模式,也就是说如果你不提供任何模式,open() 函数将会以只读模式打开文件。
文件关闭
打开文件后关闭文件使用方法 close() 完成这个操作。
文件读取
使用 read() 方法一次性读取整个文件。调用之后若再次调用 read(),它会返回空字符串因为它已经读取完整个文件。
read(size) 有一个可选的参数 size,用于指定字符串长度。如果没有指定 size 或者指定为负数,就会读取并返回整个文件。当文件大小为当前机器内存两倍时,就会产生问题。反之,会尽可能按比较大的 size 读取和返回数据。
readline() 能帮助每次读取文件的一行。
使用 readlines() 方法读取所有行到一个列表中。
文件写入
通过 write() 方法打开文件写入文本。
sys.argv 包含所有命令行参数。
sys.argv 的第一个值是命令自身的名字。
函数 enumerate(iterableobject),在序列中循环时,索引位置和对应值可以使用它同时得到。
使用 with 语句
在实际情况中,也可以尝试使用 with 语句处理文件对象,它会在文件用完后会自动关闭,就算发生异常也没关系。
实现 lscpu 命令
在 Linux 下可以使用 lscpu 命令来查看当前电脑的 CPU 相关信息。
异常处理
异常
在程序执行过程中发生的任何错误都是异常。每个异常显示一些相关的错误信息,比如你在 Python3 中使用 Python2 独有的语法就会发生 SyntaxError。
NameError
当访问一个未定义的变量则会发生 NameError。
TypeError
TypeError 也是一种经常出现的异常。当操作或函数应用于不适当类型的对象时引发。
处理异常
使用 try…except 块来处理任意异常
try:
statements to be inside try clause
statement2
statement3
...
except ExceptionName:
statements to evaluated in case of ExceptionName happens
它以如下方式工作:
- 首先,执行 try 子句 (在 try 和 except 关键字之间的部分)。
- 如果没有异常发生,except 子句 在 try 语句执行完毕后就被忽略了。
- 如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。
- 如果异常匹配于 except 关键字后面指定的异常类型,就执行对应的 except 子句。然后继续执行 try 语句之后的代码。
- 如果发生了一个异常,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中。
- 如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息。
抛出异常
使用 raise 语句抛出一个异常。
定义清理行为
try 语句还有另一个可选的 finally 子句,目的在于定义在任何情况下都一定要执行的功能。
不管有没有发生异常,finally 子句 在程序离开 try 后都一定会被执行。当 try 语句中发生了未被 except 捕获的异常(或者它发生在 except 或 else 子句中),在 finally 子句执行完后它会被重新抛出。
在真实场景的应用程序中,finally 子句用于释放外部资源(文件或网络连接之类的),无论它们的使用过程中是否出错。
类(面向对象)
定义类
class nameoftheclass(parent_class):
statement1
statement2
statement3
\init__ 方法
类的实例化使用函数符号。只要将类对象看作是一个返回新的类实例的无参数函数即可。
x = MyClass()
很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 __init__()
的特殊方法
def __init__(self):
self.data = []
类定义了 __init__()
方法的话,类的实例化操作会自动为新创建的类实例调用 __init__()
方法。
出于弹性的需要,__init__()
方法可以有参数。事实上,参数通过__init__()
传递到类的实例化操作上。
继承
当一个类继承另一个类时,它将继承父类的所有功能(如变量和方法)。这有助于重用代码。
多继承
一个类可以继承自多个类,具有父类的所有变量和方法
class MyClass(Parentclass1, Parentclass2,...):
def __init__(self):
Parentclass1.__init__(self)
Parentclass2.__init__(self)
...
...
删除对象
使用关键字 del
s = "I love you"
del s
属性(attributes)读取方法
直接使用属性
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
>>> std = Student("Kushal Das")
>>> print(std.name)
Kushal Das
>>> std.name = "Python"
>>> print(std.name)
Python
装饰器
使用 @property 装饰器能更精确的调整控制属性访问权限,@property 装饰器就是负责把一个方法变成属性调用的。
模块
模块是包括 Python 定义和声明的文件。文件名就是模块名加上 .py 后缀。
可以由全局变量 __name__
得到模块的模块名(一个字符串)。
import xxx #xxx 包的名字
from xxx import x1,x2 #从xxx包导入x1,x2 函数
from module import *# 导入模块中的所有定义
包
含有 __init__.
py 文件的目录可以用来作为一个包,目录里的所有 .py 文件都是这个包的子模块。
from mymodule import *
只能工作在模块级别的对象上,试图导入函数或类将导致 syntax error。
默认模块
在解释器里使用 help() 函数查找任何模块/类的文档。
os 模块
os 模块提供了与操作系统相关的功能。
getuid() 函数返回当前进程的有效用户 id。
getpid() 函数返回当前进程的 id。getppid() 返回父进程的 id。
uname() 函数返回识别操作系统的不同信息,在 Linux 中它返回的详细信息可以从 uname -a 命令得到。uname() 返回的对象是一个元组,(sysname, nodename, release, version, machine)。
getcwd() 函数返回当前工作目录。chdir(path) 则是更改当前目录到 path。
equests 模块
Requests 是一个第三方 Python 模块。
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
第三方模块并不是默认的模块,意味着你需要安装它。
argparse 命令行参数处理模块
这里是用到的模块是 sys,命令行传入的所有参数都可以使用 sys.argv 获取。如果希望对参数进行处理可以使用 argparse 模块。
TAB 补全
基于Linux
首先创建一个文件:~/.pythonrc ,文件内写入如下内容:
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
history_file = os.path.expanduser('~/.python_history')
readline.read_history_file(history_file)
import atexit
atexit.register(readline.write_history_file, history_file)
下一步在 ~/.bashrc 文件中设置 PYTHONSTARTUP 环境变量指向这个文件:
$ export PYTHONSTARTUP=~/.pythonrc
现在,从今以后每当你打开 bash shell,你将会有 TAB 补全和 Python 解释器中代码输入的历史记录。
要在当前 shell 中使用,source 这个 bashrc 文件。
$ source ~/.bashrc
Collections模块
collections 是 Python 内建的一个集合模块,提供了许多有用的集合类。
这个模块实现了一些很好的数据结构,它们能帮助解决各种实际问题。
import collections
Counter
Counter 是一个有助于 hashable 对象计数的 dict 子类。它是一个无序的集合,其中 hashable 对象的元素存储为字典的键,它们的计数存储为字典的值,计数可以为任意整数,包括零和负数。
Counter 对象有一个叫做 elements() 的方法,其返回的序列中,依照计数重复元素相同次数,元素顺序是无序的。
most_common() 方法返回最常见的元素及其计数,顺序为最常见到最少。
defaultdict
efaultdict 是内建 dict 类的子类,它覆写了一个方法并添加了一个可写的实例变量。其余功能与字典相同。
defaultdict() 第一个参数提供了 default_factory 属性的初始值,默认值为 None,default_factory 属性值将作为字典的默认数据类型。所有剩余的参数与字典的构造方法相同,包括关键字参数。
同样的功能使用 defaultdict 比使用 dict.setdefault 方法快。
namedtuple
命名元组有助于对元组每个位置赋予意义,并且让代码有更好的可读性和自文档性。可以在任何使用元组地方使用命名元组。
迭代器
ython 迭代器(Iterators)对象在遵守迭代器协议时需要支持如下两种方法。
__iter__(),
返回迭代器对象自身。这用在 for 和 in 语句中。
__next__()
,返回迭代器的下一个值。如果没有下一个值可以返回,那么应该抛出 StopIteration 异常。
迭代器只能被使用一次。这意味着迭代器一旦抛出 StopIteration,它会持续抛出相同的异常。
生成器
生成器是更简单的创建迭代器的方法,这通过在函数中使用 yield 关键字完成
>>> def my_generator():
... print("Inside my generator")
... yield 'a'
... yield 'b'
... yield 'c'
...
>>> my_generator()
<generator object my_generator at 0x7fbcfa0a6aa0>
在 While 循环中,每当执行到 yield 语句时,返回变量 low 的值并且生成器状态转为挂起。在下一次调用生成器时,生成器从之前冻结的地方恢复执行然后变量 low 的值增一。生成器继续 while 循环并且再次来到 yield 语句…
当调用生成器函数时它返回一个生成器对象。如果把这个对象传入 dir() 函数,会在返回的结果中找到 __iter__
和 __next__
两个方法名。
os.path.walk()
函数是最典型的这样的例子,它使用一个回调函数和当前的 os.walk
生成器。使用生成器实现节约内存。
无法创建一个可重复使用的生成器,但可以创建一个对象,将它的 __iter__
方法调用得到一个生成器。
生成器是一定不能重复循环的。
如果想要使类的实例变成迭代器,可以用 __iter__ + __next__
方法实现。
>>> from collections import Iterator
>>> class Test():
...: def __init__(self, a, b):
...: self.a = a
...: self.b = b
...: def __iter__(self):
...: return self
...: def __next__(self):
...: self.a += 1
...: if self.a > self.b:
...: raise StopIteration()
...: return self.a
...:
>>> test = Test(5, 10)
>>> isinstance(test, Iterator)
True
生成器表达式
生成器表达式是列表推导式和生成器的一个高性能,内存使用效率高的推广。
闭包
闭包(Closures)是由另外一个函数返回的函数。我们使用闭包去除重复代码。
装饰器
装饰器(Decorators)用来给一些对象动态的添加一些新的行为,我们使用过的闭包也是这样的。
测试
各类 assert 语句