【读书笔记】《利用Python进行数据分析》第2版_第二章:Python语言基础、IPython及Jupyternotebook

推荐使用IPython命令行和Jupyter notebook来实验代码示例,以及探索各种类型、函数和方法的文档。

和其他键盘控制的命令行环境一样,练就常用命令的肌肉记忆也是学习曲线的一部分。

优秀Python书籍推荐

  • 《Python Cookbook》(第3版),作者为David Beazley和Brian K.Jones(O’Reilly)
  • 《Fluent Python》,作者为Luciano Ramalho(O’Reilly)
  • 《Fluent Python》,作者为Luciano Ramalho(O’Reilly)

2.1 Python解释器

  • 标准的交互式Python解释器可以通过在命令行输入python命令来启动

  • 在命令行中看到的>>>提示符是你键入代码的地方

  • 退出Python解释器回到命令行提示符,可以输入exit()或者按下Ctrl-D

  • 运行Python文件

    $ python hello_world.py
    Hello world
    
  • 使用%run命令,IPython会在同一个进程内执行指定文件中的代码,可以立即看到结果

    In[1]:%run hello_world.py
    Hello world
    In[2]:  #IPython默认提示符用类似In[2]风格,而不是>>>提示符
    

2.2 IPython基础

运行IPython命令行

  • 输入ipython命令启动IPython命令行
  • 在IPython中仅输入一个变量名,会返回一个表示该对象的字符串

运行Jupyter notebook

  • Python的Jupyter内核使用IPython系统进行内部活动

  • 启动Jupyter时,在终端中运行jupyter notebook命令

  • 在很多平台上,Jupyter会自动打开你的默认网络浏览器(除非你使用了–no-browser命令),也可以通过http地址来浏览notebook,地址是http://localhost:8888/

  • Jupyter可以部署在服务器远端

Tab补全

  • IPython的提升之一就是tab补全功能,当在命令行输入表达式时,按下Tab键即可为任意变量(对象、函数等)搜索命名空间,与你目前已输入的字符进行匹配

  • 在输入英文的句号之后,按下tab,对方法、属性的名称进行补全,模块也可以通过相同的方式补全。

  • 在Jupyter notebook和新版的IPython(5.0及以上)中,自动补全是在下拉选项中展现,而不是文本输出。

    IPython默认情况下隐藏了以下划线开始的方法和属性,诸如魔术方法、内部“私有”方法和属性,以避免杂乱的显示(使新手混淆)。先输入下划线也可以在tab补全时找到它们。想要直接看到,要修改IPython配置。

  • 当输入任意路径(甚至是Python字符串)时,按下Tab键将补全你的计算机文件系统中匹配你输入内容的值,与%run命令搭配使用,该功能将为你节省大量键盘输入。

  • tab补全可以在函数的关键字参数(包含=号)中节约时间

内省

  • 在一个变量名的前后使用问号(?)可以显示一些关于该对象的概要信息

  • 如果对象是一个函数或实例方法且文档字符串已经写好,则文档字符串会显示出来。

  • 使用双问号??可以显示函数的源代码

  • ?的终极用途:把一些字符和通配符(星号*)结合在一起,会显示所有匹配通配符表达式的命名。

    In[13]:np.*load*?
    np.__loader__
    np.load
    np.loads
    np.loadtxt
    np.pkgload
    

%run命令

  • 在IPython会话中使用%run命令运行任意的Python程序文件,这个行为与在命令行中使用python script.py来运行程序相同。文件中定义的所有变量(导入的、函数中的、全局定义的)在运行后,可以在IPython命令行中使用(除非出现某种异常)。

  • 一个Python脚本需要命令行提供参数(通过sys.argv获得)

  • 如果你想让待运行的脚本使用交互式IPython命名空间中已有的变量,请使用%run -i替代普通的%run命令。

  • 在Jupyter notebook中,使用%load魔术函数将脚本导入一个代码单元

中断运行中的代码

  • 在任意代码运行时按下Ctrl-C,都将引起KeyboardInterrupt,Python程序会立即停止运行。

  • 当一段Python代码被其他已经编译的扩展模块调用时,按下Ctrl-C并不会让程序立即停止运行。在这些情况下,你需要等到控制流重新返回Python解释器,在更糟糕的情况下可能要强制结束Python进程。

执行剪贴板中的程序

  • %paste和%cpaste魔术函数
    • %paste会获得剪贴板中的所有文本,并在命令行中作为一个代码块去执行
    • %cpaste与之类似,只不过它会给出一个特殊的提示符,让你粘贴代码
    • 如果你发现粘贴的代码有误,可以按下Ctrl-C来中断%cpaste提示符

终端快捷键

  • IPython快捷键

    • 标准IPython快捷键

    • Ipython命令行的部分快捷键

  • Jupyter Notebook有一个独立的快捷键集合用于导航和编辑,快捷键的更新比IPython更为频繁,可以在菜单栏中的帮助系统进行学习。

关于魔术命令

  • IPython的特殊命令(没有内建到Python自身中去)被称为“魔术”命令,前缀符号为%,例如使用%timeit来检查Python语句的执行时间。

  • 魔术命令可以看作是IPython系统内部的命令行程序,大多数魔术命令可以使用?查看额外的“命令行”选项。

  • 魔术函数也可以不加百分号%就使用,只要没有变量被定义为与魔术函数相同的名字即可。这种特性被称为自动魔术,通过%automagic进行启用/禁用关。

  • 一些魔术函数也像Python函数一样,其输出可以赋给一个变量。

  • 建议使用%quickref或者%magic探索所有的特殊命令

  • 一些常用的魔术命令

matplotlib集成

  • %matplotlib魔术函数可以设置matplotlib与IPython命令行或Jupyter notebook的集成。

  • IPython命令行,运行%matplotlib命令生成多个绘图窗口,而不干扰控制台的会话

    In[26]:%matplotlib
    Using matplotlib backend:Qt4Agg
    
  • 在Jupyter中,命令会有不同

    In[26]:%matplotlib inline
    

2.3 Python语言基础

语言语义

缩进,而不是大括号

  • 一个冒号代表一个缩进代码块的开始,单个代码块要保持相同的缩进,直到代码块结束
  • 使用四个空格来缩进
  • Python语句不以分号结尾,但可以用于在一行内进行多条语句之间的分隔,但是一行有多条语句,代码可读性会变差

一切皆为对象

  • 每一个数值、字符串、数据结构、函数、类、模块以及所有存在于Python解释器中的事物,都是Python对象。

注释

  • “#”用来注释

函数和对象方法的调用

  • 几乎所有的Python对象都有内部函数,称为方法,可以访问到对象内部的内容
  • 函数传参既可以是位置参数也可以是关键字参数

变量和参数传递

  • 在Python中对一个变量(或者变量名)赋值时,你就创建了一个指向等号右边对象的引用

  • In[8]:a=[1,2,3]
    In[9]:b=a   #此时a和b指向同一个对象
    
  • 赋值也被称为绑定,这是因为我们将一个变量名绑定到了一个对象上。已被赋值的变量名有时也会被称为被绑定变量

  • 可以更换可变参数的内部值

    In[27]:data=[1,2,3]
    In[28]:append_element(data,4)
    In[29]:data
    Out[29]:[1,2,3,4]
    

动态引用,强类型

  • 变量对于对象来说只是特定命名空间中的名称;类型信息是存储在对象自身之中的

  • Python被认为是强类型语言,这意味着所有的对象都拥有一个指定的类型(或类),隐式的转换只在某些特定、明显的情况下发生

  • 可以使用isinstance函数来检查一个对象是否是特定类型的实例,它也接受包含一个类型的元组,可以检查对象的类型是否在元组的类型中。

    In[21]:a=5
    In[22]:isinstance(a,int)
    Out[22]:True
    In[23]:a=5;b=4.5
    In[24]:isinstance(a,(int,float))
    Out[24]:True
    

属性和方法

  • 属性和方法可以用obj.attribute_name进行调用

    In [1]: a = 'foo'
    
    In [2]: a.<Press Tab>
    a.capitalize  a.format      a.isupper     a.rindex      a.strip
    a.center      a.index       a.join        a.rjust       a.swapcase
    a.count       a.isalnum     a.ljust       a.rpartition  a.title
    a.decode      a.isalpha     a.lower       a.rsplit      a.translate
    a.encode      a.isdigit     a.lstrip      a.rstrip      a.upper
    a.endswith    a.islower     a.partition   a.split       a.zfill
    a.expandtabs  a.isspace     a.replace     a.splitlines
    a.find        a.istitle     a.rfind       a.startswith
    
  • 属性和方法也可以通过getattr函数获得

    In[27]:getattr(a,'split')
    Out[28]:<function str.split>
    

    在其他的语言中,通过变量名访问对象通常被称为“反射”,它们可以用来高效地编写通用、可复用的代码。

鸭子类型

  • “鸭子类型”的说法源于“一个东西走起来像鸭子叫起来像鸭子,那它就是鸭子”。例如,你可以验证一个对象如果实现了迭代器协议,那它一定是可以迭代的。

  • 当一个函数接受多种输入类型时,可以使用isiterable函数。比如:写接受任意序列类型(列表、元组、n维数组),甚至是一个迭代器的函数时使用这项功能。你可以先检查对象是否是一个列表(或者一个NumPy数组),如果不是就把它转换为列表:

    if not isinstance(x, list) and isiterable(x): 
    	x = list(x)
    

导入

  • 模块:在Python中,模块就是以.py为后缀名并包含Python代码的文件。

二元运算符和比较运算

  • 检查两个引用是否指向同一个对象,可以使用is关键字,不是可以用is not。

  • is和==是不同的

    In[1]:a=[1,2,3]
    In[2]:c=list(a)
    In[3]:a is not c  # list函数总是创建一个新的Python列表(即一份拷贝)
    Out[1]:True
    In[4]:a==c
    Out[2]:True
    
  • is和is not的常用之处是检查一个变量是否为None

    In[1]:a=None
    In[2]:a is None
    Out[1]:True
    
  • 二元操作符

可变对象和不可变对象

  • Python中的大部分对象,例如列表、字典、NumPy数组都是可变对象,大多数用户定义的类型(类)也是可变的。可变对象中包含的对象和值是可以被修改的。
  • 字符串和元组是不可变对象。
  • 修改行为会有副作用,建议使用不可变性,尽量不可变对象中也可能包含可变对象。

标量类型

  • Python的标准库中拥有一个小的内建类型集合,用来处理数值数据、字符串、布尔值(True或False)以及日期和时间。这类的“单值”类型有时被称为标量类型,我们在本书中称之为标量。
  • 标准库中含有datetime模块,日期和时间的处理将单独讨论
  • 标准Python标量类型 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBqWPL0y-1648440797586)(https://cdn.jsdelivr.net/gh/tang-colorful/Images/Images/image-20220313233326774.png)]

数值类型

  • 基础的Python数字类型就是int和float,int可以存储任意大小数字,浮点数是双精度64位数值(可以用科学计数法表示)
  • 整数除法结果会自动转型为浮点数
  • 只保留整数部分,使用“//”

字符串

  • 字符串可以用单引号和双引号表示

  • 对于含有换行的多行字符串,你可以使用三个单引号’’’或三个双引号"""

  • Python中字符串不可变,无法修改

  • c = """
    This is a longer string that
    spans multiple lines
    """
    # c中有三个回车符
    

    c实际上包含了四行文本;"""后的换行和lines后的换行都是包含在字符串中的

  • Python对象可以通过str函数转成字符串

  • 字符串是Unicode字符的序列,因此可以被看作是除了列表和元组外的另一种序列

  • 转义字符:\

  • 加前缀符号r表示字符是原生字符(r是raw的简写,表示原生的)

    In[1]:s = r'this\has\no\special\characters'
    In[2]:s
    Out[1]:'this\has\no\special\characters'
    
  • 字符串格式化

    In[1]:template = '{0:.2f} {1:s} are worth US${2:d}'
    In[2]:template.format(4.5560, 'Argentine Pesos', 1)
    Out[1]:'4.56 Argentine Pesos are worth US$1'
    

    字符串官方文档:https://docs.python.org/3.6/library/string.html

字节与Unicode

  • Python 3.0及以上,Unicode成为字符串类型的一等类,用于更好地兼容处理ASCII和非ASCII文本。以前的Unicode编码完全是字节。

  • 使用enocde方法将这个Unicode字符串转换为UTF-8字节,decode方法进行解码。

  • 在字符串前加前缀b来定义字符文本(用法很少)

    bytes_val = b'this is bytes'
    bytes_val
    decoded = bytes_val.decode('utf8')
    decoded  # this is str (Unicode) now
    

布尔值

  • Python中的布尔值写作True和False,可以与and和or关键字合用。

类型转换

  • str、bool、int和float既是数据类型,同时也是可以将其他数据转换为这些类型的函数

None

  • None是Python的null值类型

  • 如果一个函数没有显式地返回值,则它会隐式地返回None

  • None还可以作为一个常用的函数参数默认值

  • 从技术角度来说,None不仅是一个关键字,它还是NoneType类型的唯一实例

    In[1]:type(None)
    Out[1]:NoneType
    

日期和时间

  • datetime模块:提供了datetime、data和time类型,包含日期和时间信息。

    In[1]:from datetime import datetime, date, time
    In[2]:dt = datetime(2011, 10, 29, 20, 30, 21)
    In[3]:dt.day
    Out[1]:29
    In[4]:dt.minute
    Out[2]:30
    
  • 获取date和time对象:date和time方法

    In[5]:dt.date()
    Out[3]:datetime.date(2011,10,29)
    In[6]:dt.time()
    Out[4]:datetime.time(20,30,21)
    
  • strftime方法将datetime转换为字符串

  • 字符串可以通过strptime函数转换为datetime对象

  • 使用replace替换

    dt.replace(minute=0,second=0)
    

    datetime.datetime是不可变类型,以上的方法都是产生新的对象

  • 两个不同的datetime对象会产生一个datatime.timedelta类型的对象,表示时间间隔;将timedelta加到一个datetime上将产生一个新的对象。

  • Datetime格式化详细说明(ISO C89兼容)

控制流

if、elif和else

  • 一个if语句可以接多个elif代码块和一个else代码块,如果所有的elif条件均为False,则执行else代码块。
  • 当使用and和or进行混合条件判断时,条件判断是从左到右的并且在and或or两侧的条件会有“短路”现象
  • if中允许有链式比较

for循环

  • for循环用于遍历一个集合(例如列表或元组)或一个迭代器
  • 使用continue关键字可以跳过conitnue后面的代码进入下一次循环
  • 使用break关键字可以结束一个for循环

​ break关键字只结束最内层的for循环;外层的for循环会继续运行

while循环

  • while循环会在条件符合时一直执行代码块,直到条件判断为False或显式地以break结尾时才结束

pass

  • pass在Python中表示什么都不做,可以作为没有实现的代码占位符

range

  • range函数返回一个迭代器,该迭代器生成一个等差整数序列

    In[1]:range(10)
    Out[1]:range(0,10)
    In[2]:list(range(10))
    Out[2]:[0,1,2,3,4,5,6,7,8,9]
    
  • 起始、结尾、步进(可以是负的)可以传参给range函数

    In[1]:list(range(5,0,-1))
    Out[1]:[5,4,3,2,1]
    

    range产生的整数包含起始但不包含结尾,常用于遍历序列

三元表达式

  • 将一个if-else代码块联合起来

    value = true-expr if condition else false-expr
    

    可以压缩代码量,但是牺牲可读性

你可能感兴趣的:(python,python,pytorch,深度学习)