一、Python解释器

Python是解释性语言。Python解释器同一时间只能运行一个程序的一条语句。标准的交互Python解释器可以在命令行中通过键入python命令打开。
提示输入代码。要退出Python解释器返回终端,可以输入exit()或按Ctrl-D。
运行Python程序只需调用Python的同时,使用一个.py文件作为它的第一个参数。假设创建了一个hello_world.py文件,可以用下面的命令运行它(hello_world.py文件必须位于终端的工作目录):

$ python hello_world.py
%run hello_world.py

二、IPython基础

1、运行IPython Shell

用ipython在命令行打开IPython Shell。

taskset 运行python时只能绑定一个CPU python只能运行一个文件_Python

2、运行Jupyter Notebook

notebook是Jupyter项目的重要组件之一,它是一个代码、文本(有标记或无标记)、数据可视化或其它输出的交互式文档。Jupyter

需要与内核互动,内核是Jupyter与其它编程语言的交互编程协议。Python的Jupyter内核是使用IPython。要启动Jupyter,在命令行中输入jupyter notebook:

taskset 运行python时只能绑定一个CPU python只能运行一个文件_补全_02


在多数平台上,Jupyter会自动打开默认的浏览器(除非指定了–no-browser)。或者,可以在启动notebook之后,手动打开网页http://localhost:8888/。

%run,tab补全可以节省许多键盘操作。
从外观上,IPython shell和标准的Python解释器只是看起来不同。IPython shell的进步之一是具备其它IDE和交互计算分析环境都有的tab补全功能。在shell中输入表达式,按下Tab,会搜索已输入变量(对象、函数等等)的命名空间,也可以补全任何对象的方法和属性。同样也适用于模块。

在Jupyter notebook和新版的IPython(5.0及以上),自动补全功能是下拉框的形式。除了补全命名、对象和模块属性,Tab还可以补全其它的。当输入看似文件路径时(即使是Python字符串),按下Tab也可以补全电脑上对应的文件信息。tab补全可以补全函数的关键词参数(包括等于号=)。

自省

在变量前后使用问号?,可以显示对象的信息:

taskset 运行python时只能绑定一个CPU python只能运行一个文件_补全_03


?还有一个用途,就是像Unix或Windows命令行一样搜索IPython的命名空间。字符与通配符结合可以匹配所有的名字。例如,我们可以获得所有包含load的顶级NumPy命名空间。

taskset 运行python时只能绑定一个CPU python只能运行一个文件_Python_04


使用??会显示函数的源码

%run命令

%run ipython_script_test.py

这段脚本运行在空的命名空间(没有import和其它定义的变量),因此结果和普通的运行方式python script.py相同。文件中所有定义的变量(import、函数和全局变量,除非抛出异常),都可以在IPython shell中随后访问。

在Jupyter notebook中,你也可以使用%load,它将脚本导入到一个代码格中:

%load ipython_script_test.py

中断运行的代码 Ctrl+C
代码运行时按Ctrl-C,无论是%run或长时间运行命令,都会导致KeyboardInterrupt。这会导致几乎所有Python程序立即停止,除非一些特殊情况。

当Python代码调用了一些编译的扩展模块,按Ctrl-C不一定将执行的程序立即停止。在这种情况下,你必须等待,直到控制返回Python解释器,或者在更糟糕的情况下强制终止Python进程。

从剪贴板执行程序
如果使用Jupyter notebook,你可以将代码复制粘贴到任意代码格执行。在IPython shell中也可以从剪贴板执行。
最简单的方法是使用%paste和%cpaste函数。%paste可以直接运行剪贴板中的代码,%cpaste功能类似,但会给出一条提示。

使用%cpaste,你可以粘贴任意多的代码再运行。你可能想在运行前,先看看代码。如果粘贴了错误的代码,可以用Ctrl-C中断。

键盘快捷键

ipython快捷键:

taskset 运行python时只能绑定一个CPU python只能运行一个文件_补全_05


Jupyter notebooks有另外一套庞大的快捷键魔术命令

IPython的文档可以在shell中打开,我建议你用%quickref或%magic学习下所有特殊命令。表2-2列出了一些可以提高生产率的交互计算和Python开发的IPython指令。

taskset 运行python时只能绑定一个CPU python只能运行一个文件_Python_06


集成Matplotlib

%matplotlib魔术函数配置了IPython shell和Jupyter notebook中的matplotlib。这点很重要,其它创建的图不会出现(notebook)或获取session的控制,直到结束(shell)。

#在IPython shell中,运行%matplotlib可以进行设置,可以创建多个绘图窗口,而不会干扰控制台session:
%matplotlib
#在JUpyter中,命令有所不同
%matplotlib inline

三、Python语法基础

3.1、python对象

Python语言的一个重要特性就是它的对象模型的一致性。每个数字、字符串、数据结构、函数、类、模块等等,都是在Python解释器的自有“盒子”内,它被认为是Python对象。每个对象都有类型(例如,字符串或函数)和内部数据。在实际中,这可以让语言非常灵活,因为函数也可以被当做对象使用。

3.2、变量和参数传递

#当在Python中创建变量(或名字),你就在等号右边创建了一个对这个变量的引用。
a = [1,2,3]
b = a

taskset 运行python时只能绑定一个CPU python只能运行一个文件_字符串_07

赋值也被称作绑定,我们是把一个名字绑定给一个对象。变量名有时可能被称为绑定变量。

def append_element(some_list, element):
    some_list.append(element)
    
data = [1, 2, 3]
append_element(data, 4)
print(data)
append_element(data,5)
print(data)

[1, 2, 3, 4]
[1, 2, 3, 4, 5]

3.3、动态引用,强类型

在某些语言中,例如Visual Basic,字符串‘5’可能被默许转换(或投射)为整数,因此会产生10。但在其它语言中,例如JavaScript,整数5会被投射成字符串,结果是联结字符串‘55’。在这个方面,Python被认为是强类型化语言,意味着每个对象都有明确的类型(或类),默许转换只会发生在特定的情况下,例如:

taskset 运行python时只能绑定一个CPU python只能运行一个文件_字符串_08


可以用isinstance函数检查对象是某个类型的实例,isinstance可以用类型元组,检查对象的类型是否在元组中,返回True或False。

a = 5
b = 3.5
isinstance(a,int)
isinstance(a,(int,float))

3.4、属性和方法

Python的对象通常都有属性(其它存储在对象内部的Python对象)和方法(对象的附属函数可以访问对象的内部数据)。可以用obj.attribute_name访问属性和方法:

a = 'foo'
a.<Press Tab>

3.5、鸭子类型

经常地,你可能不关心对象的类型,只关心对象是否有某些方法或用途。这通常被称为“鸭子类型”,来自“走起来像鸭子、叫起来像鸭子,那么它就是鸭子”的说法。
例如,你可以通过验证一个对象是否遵循迭代协议,判断它是可迭代的。对于许多对象,这意味着它有一个__iter__魔术方法,其它更好的判断方法是使用iter函数:

#这个功能编写可以接受多种输入类型的函数
def isiterable(obj):
    try:
        iter(obj)
        return True
    except TypeError: # not iterable
        return False
 isiterable('a string')
 isiterable('4')

True
False

#常见的例子是编写一个函数可以接受任意类型的序列(list、tuple、ndarray)或是迭代器。你可先检验对象是否是列表(或是NUmPy数组),如果不是的话,将其转变成列表
if not isinstance(x, list) and isiterable(x):
    x = list(x)

3.6、引入

在Python中,模块就是一个有.py扩展名、包含Python代码的文件。假设有以下模块:

# some_module.py
PI = 3.14159

def f(x):
    return x + 2

def g(a, b):
    return a + b

如果想从同目录下的另一个文件访问some_module.py中定义的变量和函数

import some_module

res = some_module.f(5)
pi = some_module.PI

或者

from some_moudle import f,g,PI

res = f(5)
pi = PI
res2 = g(5,PI)

或者

#使用as关键词,你可以给引入起不同的变量名
import some_module as sm
from some_module import PI as pi, g as gf

r1 = sm.f(pi)
r2 = gf(6, pi)

3.7、二元运算符和比较运算符

要判断两个引用是否指向同一个对象,可以使用is方法。is not可以判断两个对象是不同的

a = [1, 2, 3]
b = a
c = list(a) #list总是创建一个新的Python列表(即复制),我们可以断定c是不同于a的
a is b
c is a

True
False
is 和 == 运算符不同:

a == c

True

is和is not常用来判断一个变量是否为None

taskset 运行python时只能绑定一个CPU python只能运行一个文件_Python_09

3.8、可变与不可变对象

Python中的大多数对象,比如列表、字典、NumPy数组,和用户定义的类型(类),都是可变的。意味着这些对象或包含的值可以被修改。其它的,例如字符串和元组,是不可变的。

3.9、标量类型

Python的标准库中有一些内建的类型,用于处理数值数据、字符串、布尔值,和日期时间。这些单值类型被称为标量类型。

taskset 运行python时只能绑定一个CPU python只能运行一个文件_Python_10

3.10、数值类型

Python的主要数值类型是int和float。int可以存储任意大的数。浮点数使用Python的float类型。每个数都是双精度(64位)的值。也可以用科学计数法表示。不能得到整数的除法会得到浮点数,可以使用底除运算符//。

3.11、字符串

许多人是因为Python强大而灵活的字符串处理而使用Python的。你可以用单引号或双引号来写字符串。
对于有换行符的字符串,可以使用三引号,’’'或"""都行。

d = '''
第一行
第二行
第三行
'''
print(d)
#字符串c实际包含5行文本,"""后面和lines后面的换行符。可以用count方法计算c中的新的行
print(d.count('\n'))

第一行
第二行
第三行

4
Python的字符串是不可变的,不能修改字符串。许多Python对象使用str函数可以被转化为字符串。
字符串是一个序列的Unicode字符,因此可以像其它序列,比如列表和元组一样处理:

s = 'python'
print(s[0:2])
list_s = list(s)
print(list_s)

py
[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]
反斜杠是转义字符,意思是它备用来表示特殊字符,比如换行符\n或Unicode字符。要写一个包含反斜杠的字符串,需要进行转义:

s = '12\\34'
print(s)

12\34
如果字符串中包含许多反斜杠,但没有特殊字符,这样做就很麻烦。幸好,可以在字符串前面加一个r,表明字符就是它自身,r表示raw。

s = r'this\has\no\special\characters'
print(s)

this\has\no\special\characters
字符串对象有format方法,可以替换格式化的参数为字符串,产生一个新的字符串:

template = '{0:.2f} {1:s} are worth US${2:d}'
'''
{0:.2f}表示格式化第一个参数为带有两位小数的浮点数。
{1:s}表示格式化第二个参数为字符串。
{2:d}表示格式化第三个参数为一个整数。
'''
#要替换参数为这些格式化的参数,我们传递format方法一个序列
template.format(4.5560, 'Argentine Pesos', 1)
print(template)
print(template.format(4.5560, 'Argentine Pesos', 1))
{0:.2f} {1:s} are worth US${2:d}
 4.56 Argentine Pesos are worth US$1

3.12、字节和Unicode

在Python 3及以上版本中,Unicode是一级的字符串类型,这样可以更一致的处理ASCII和Non-ASCII文本。

3.13、布尔值

Python中的布尔值有两个,True和False。比较和其它条件表达式可以用True和False判断。布尔值可以与and和or结合使用

3.14、类型转换

str、bool、int和float也是函数,可以用来转换类型

3.15、None

None是Python的空值类型。如果一个函数没有明确的返回值,就会默认返回None。

3.16、日期和时间

Python内建的datetime模块提供了datetime、date和time类型。datetime类型结合了date和time,是最常使用的。根据datetime实例,可以用date和time提取出各自的对象

from datetime import datetime, date, time
dt = datetime(2011, 10, 29, 20, 30, 21)
print(dt.date())
print(dt.time())
print(dt.day)
print(dt.minute)

2011-10-29
29
30

strftime方法可以将datetime格式化为字符串,strptime可以将字符串转换成datetime对象。

dt.strftime('%m/%d/%Y %H:%M')

datetime.strptime('20091031', '%Y%m%d')

所有的格式化命令:

taskset 运行python时只能绑定一个CPU python只能运行一个文件_字符串_11


当你聚类或对时间序列进行分组,替换datetimes的time字段有时会很有用。例如,用0替换分和秒。因为datetime.datetime是不可变类型,上面的方法会产生新的对象

dt.replace(minute=0, second=0)
#两个datetime对象的差会产生一个datetime.timedelta类型
dt2 = datetime(2011, 11, 15, 22, 30)
delta = dt2 - dt #datetime.timedelta(17, 7179)
#timedelta(17, 7179)指明了timedelta将17天、7179秒的编码方式

#将timedelta添加到datetime,会产生一个新的偏移datetime
dt #datetime.datetime(2011, 10, 29, 20, 30, 21)
dt + delta #datetime.datetime(2011, 11, 15, 22, 30)

3.17、控制流

Python有若干内建的关键字进行条件逻辑、循环和其它控制流操作。

if、elif和else

if后面可以跟一个或多个elif,所有条件都是False时,还可以添加一个else。
如果某个条件为True,后面的elif就不会被执行。当使用and和or时,复合条件语句是从左到右执行。

if x < 0:
    print('It's negative')
elif x == 0:
    print('Equal to zero')
elif 0 < x < 5:
    print('Positive but smaller than 5')
else:
    print('Positive and larger than or equal to 5')
for循环

for循环是在一个集合(列表或元组)中进行迭代,或者就是一个迭代器。for循环的标准语法是:

for value in collection:
    # do something with value

continue使for循环提前跳过当前循环的剩下的部分。看下面这个例子,将一个列表中的整数相加,跳过None:

sequence = [1, 2, None, 4, None, 5]
total = 0
for value in sequence:
    if value is None:
        continue
    total += value

break跳出for循环,结束这一层的for循环。下面的代码将各元素相加,直到遇到5
break只中断for循环的最内层,其余的for循环仍会运行

sequence = [1, 2, 0, 4, 6, 5, 2, 1]
total_until_5 = 0
for value in sequence:
    if value == 5:
        break
    total_until_5 += value

3.18、While循环

while循环指定了条件和代码,当条件为False或用break退出循环,代码才会退出:

x = 256
total = 0
while x > 0:
    if total > 500:
        break
    total += x
    x = x // 2

3.19、pass

pass是Python中的非操作语句。代码块不需要任何动作时可以使用(作为未执行代码的占位符);因为Python需要使用空白字符划定代码块,所以需要pass。

3.20、range

range函数返回一个迭代器,它产生一个均匀分布的整数序列。虽然range可以产生任意大的数,但任意时刻耗用的内存却很小。

#range产生的整数不包括终点
 range(10) # range(0,10)
 list(range(10))
 #range的三个参数是(起点,终点,步进)
 list(range(0, 20, 2)) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

range的常见用法是用序号迭代序列。

seq = [1, 2, 3, 4]
for i in range(len(seq)):
    val = seq[i]

3.21、三元表达式

Python中的三元表达式可以将if-else语句放到一行里。语法如下:

value = true-expr if condition else false-expr

true-expr或false-expr可以是任何Python代码。它和下面的代码效果相同:

if condition:
    value = true-expr
else:
    value = false-expr