真锋
永远保持一颗学习和专注的心
嵌入式视觉笔记

Python 语法基础

从去年10月份开始学习 Python,到现在也1年了,从刚开始的学会了些简单Python 语法,到现在已经熟悉了 Python 编程,正在像熟练掌握Python进阶,之前也写过两篇 Python 学习的博客( Python 基本教程和 Python 函数学习),但是由于服务器崩溃的原因,导致遗失了。

后来想再写下,但是又觉得太过基础,除了用于自己复习记录,文章本身还是写得一般。其实网上有一些博客真的是为了写而写,真的有水博客的,但也有人虽然写的不多,但是每篇都很完整,写的也不错,总结的也很全面。

这几天编程感觉遇到了些瓶颈,所以抽出些时间重新认真学习和总结下Python,把一些语法和技巧深入理解下。今天这篇博客,大部分参考自《利用Python进行数据分析》这本书,我加以拓展。偏向 Python 基础语法,但是总结得相对透彻些。

Python 语法基础

语言的语义

Python的语言设计强调的是可读性、简洁和清晰。有些人称Python为“可执行的伪代码”。

不过我不这么认为,虽然Python入门比较简单,不过那是因为Python语法和C/C++相比简单很多,但是你要借助Python在某个领域,比如机器学习、数据分析、网站建设等方向有所成就的话,那你就要花很大功夫去熟悉掌握Python的特性和高级编程,这时候你就会发现Python只是学习语法简单些,但是在后期熟练掌握和精通一样很难。

所以别以为网上大家人云亦云说Python简单,你就看轻他,我个人始终认为,想要熟练掌握/精通一门编程语言,你就要重视他、相信他。

使用缩进,而不是括号

Python编程有着严格的缩进要求,强烈建议使用四个空格作为默认的缩进,也可以使用tab代替四个空格。

万物皆对象

Python语言的一个重要特性就是它的对象模型的一致性。每个数字、字符串、数据结构(列表、元组、字典等)、函数、类、模块等等,都是在Python解释器的自有“盒子”内,它们被认为是Python对象。

每个对象都有类型(例如,字符串或函数)和内部数据。在实际中,这可以让语言非常灵活,因为函数也可以被当做对象使用。

注释

在python中,任何前面带有井号#的文本都会被Python解释器忽略,这通常被用来添加注释。这与C/C++使用//来做注释是不同的。

函数和对象方法调用

使用圆括号调用函数,传递零或几个参数,或者将返回值传递给一个或几个变量:

result = function(x,y,z)
g()

几乎Python中的每个对象都有附加的函数,称作方法,可以用来访问对象的内容(对象方法在实际编程中经常遇到,可自行理解体会)。可以用下面的语句调用:

object.some_method(x,y,z)

函数也可以使用位置和关键词参数:

result = f(a,b,c,d=5,e='foo')

注意,Python编程中,我们需要使用很多库,但是我们又不可能精通所有的库,为了达到快速编程的目的,我们使用库中的函数时,一定要首先掌握函数的参数及其含义、函数 功能和函数返回值。

变量和参数传递

当在Python中创建变量(或名字),你同时也要在等号右边创建了一个对这个变量的引用。以字符串列表为例:

a = ['harley','alen','jan']

将a赋值给一个新变量b

b = a

在有些方法中,这个赋值会将数据[‘harley’,’alen’,’jan’]也复制。在Python中,a和b实际上是同一个对象,即原有列表[‘harley’,’alen’,’jan’]。我们可以在a中添加一个元素,然后检查b:

a.append('abell')
b

理解Python的引用的含义,数据是何时、如何、为何复制的,是非常重要的。尤其是当你用Python处理大的数据集时。

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

动态引用,强类型 

与许多编译语言(如JAVA和C++)对比,Python中的对象引用不包含附属的类型。所以,下面的代码在Python中是没有问题的:

a = 'abell'
type(a)
a = 6
type(a)

变量是在特殊命名空间中的对象的名字,类型信息保存在对象自身中。

对象的类型是很重要的概念,在编程中我经常碰到对象类型不匹配的问题,但是python对象类型使用的混乱又没办法,所以在输入对象给函数之前,建议使用isinstance函数检查对象是否是某个类型的实例:

a = 5
isinstance(a,int)

注意:isinstance函数只支持Python自带的数据类型,图像处理中常用的ndarray类型是不支持的,不过可以自己写一个函数来判断参数类型是否正确。

属性和方法

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

a = 'harley'
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

鸭子类型

这个名字很奇怪,我以前没看过这个名字,也是今天看书才看到的,不过还是挺有意思的。

经常地,你可能不关心对象的类型,只关心对象是否有某些方法或用途。这通常被称为“鸭子类型”,来自“走起来像鸭子、叫起来像鸭子,那么它就是鸭子”的说法。例如,你可以通过验证一个对象是否遵循迭代协议,判断它是可迭代的。

对于许多对象,这意味着它有一个__iter__魔术方法,其它更好的判断方法是使用iter函数:

def isiterable(obj):
try:
iter(obj)
return True
except TypeError:
return False

这个功能可以用来编写接受多种输入类型的函数。常见的例子就是编写一个函数可以接受任意类型的序列(list,tuple,dic,ndarray)或是迭代器。你可以先检验对象是否是列表(或是Numpy数组),如果不是的话,将其转换为列表:

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

引入(导入模块)

在Python中,模块就是一个有.py拓展名和包含Python代码的文件。

二元运算符和比较运算符

常见运算符如下:

可变与不可变对象

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

我们要记住,可以修改一个对象并不意味就要修改它,这被称为副作用。例如,当写一个函数,任何副作用都要在文档或注释中写明。如果可能的话,我推荐避免副作用,采用不可变的方式,即使要用到可变对象。

标量类型

在Python得标准库中有一些内建类型,用于处理数值数据、字符串、布尔值和日期时间。这些单值类型被成为标量类型,本书称其为标量。主要得标量如下表所示:

数值类型

Python得主要数据类型就是intfloat。用法如下图

注意,Python中整除是通过//运算符。

字符串

与C/C++相比,Python对字符串得处理真的很灵活,尤其是在Python3中对中文字符串也支持友好了。可以用单引号或双引号来写字符串:

注意:Python的字符串是不可变的,不能修改字符串:

许多Python对象使用str函数可以被转化为字符串(这个str函数很有用):

a = 6.7
s = str(a)
s
print(type(s))

字符串是一个序列的Unicode字符,因此可以像其它序列,比如列表和元组一样处理:

反斜杠是转义字符,意思是它备用来表示特殊字符,比如换行符\n或Unicode字符。要写一个包含反斜杠的字符串,需要进行转义:

通过转义字符,可以联想到为什么Windows系统下路径要用\\表示了,因为一个\表示转义字符,容易引起误解。

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

合并两个字符串可以用加号。

a = 'c:/'
b = 'Python3/'
a+b # 'c:/Python3/'

字符串的模板化或格式化是一个重要的知识点,在编程中经常遇到!字符串对象有format方法,可以替换格式化的参数为字符串,产生一个新的字符串:

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

在template这个字符串中,

  • {0:.2f}表示格式化第一个参数为带有两位小数的浮点数。
  • {1:s}表示格式化第二个参数为字符串。
  • {2:d}表示格式化第三个参数为一个整数。

要替换参数为这些格式化的参数,我们传递format方法一个序列:

字节和Unicode

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

布尔值

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

类型转换

常用的类型转换函数有str、bool、int和float,可用以转换数据类型。

控制流

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

  • if、elif和else(if它检查一个条件,如果为True,就执行后面的语句)
  • for循环(for循环是在一个集合(列表或元组)中进行迭代,或者就是一个迭代器)
  • While循环(while循环指定了条件和代码,当条件为False或用break退出循环,代码才会退出)
  • pass(pass是Python中的非操作语句。代码块不需要任何动作时可使用(作为未执行代码的占位符))

参考资料

  • 利用Python进行数据分析第二版
赞赏

发表评论

textsms
account_circle
email

嵌入式视觉笔记

Python 语法基础
从去年10月份开始学习 Python,到现在也1年了,从刚开始的学会了些简单Python 语法,到现在已经熟悉了 Python 编程,正在像熟练掌握Python进阶,之前也写过两篇 Python 学习的博客( Pyth…
扫描二维码继续阅读
2018-12-16