-
一种解释性(不是编译)语言。与C或者Fortran等不同,Python代码在执行前不会编译。另外,Python可以交互使用:有许多的Python解释器,命令和脚本可以在其中执行。
-
在开源证书下发布的免费软件:Python可以免费使用和分发,即使用于商用。
-
多平台:Python可以用于所有的主流操作系统,Windows、Linux/Unix、MacOS X, 甚至可能是你有手机操作系统等等。
-
可读性很强的语言,有清晰不罗嗦的语法
-
拥有大量高质量的包,可以应用于多种多样的应用,从网站框架到科学计算。
-
非常简单的接口与其他语言交互,特别是C和C++
-
稍后会介绍一些语言的其他特性。例如Python是面向对象的语言,包含动态类型(一个变量可以在程序过程中,可以包含不同的对象类型)。
如果你的电脑上还没有安装IPython,也可以选择其他Python shells,比如在终端中输入“Python”启动纯Python shell,或者Idle解释器。但是,我们建议使用IPython Shell,因为它增强特性,特别是对于科学计算。
如果你已经启动了解释器,输入
接下来就会显示信息"Hello, world!"。你已经执行了你的第一条Python命令,恭喜!
你自己开始吧,输入下列命令
上面定义了a和b两个变量。注意这里在赋值前没有声明变量类型。相反,在C中,应该写为:
另外,变量的类型可以改变,在一个时间点它可以等于一个特定类型,在接下来的时间里,他可以等于另外的类型。b首先等于整数,但是当它被赋值为"hello"时他变成等于字符。在Python中,整数的运算符(b=2*a)原生支持的,一些字符上的操作符例如相加和相乘也是支持的,相当于串联和重复。
Python支持如下的数值、标量类型:
因此,Python shell可以代替你的口袋计算器,因为基本的代数操作符 +、-、*、/、%(模)都已经原生实现了。
如果你明确想要整除,请使用//:
Python提供了许多有效的容器类型,其中存储了对象集合。
列表是一个有序的对象集合,对象可以有多种类型。例如:
索引:访问包含在列表中的单个对象:
使用负索引,从结尾开始计数:
切片:获得规律分布元素的子列表:
所有切片参数都是可选的:
列表是可变对象,可以被改变:
注:一个列表的元素可以有不同的类型:
对于一个所有类型都相同的数值数据集合,使用Numpy模块提供的数组类型通常更有效。Numpy数组是包含固定大小项目的内存组块。使用Numpy数组,元素上的操作可以非常快速,因为元素均匀分布在内存上并且更多的操作是通过特殊的C函数而不是Python循环。
L.pop() # 删除并返回最后一个项目
符号r.method() (即 r.append(3) and L.pop()) 是我们第一个关于面向对象编程的例子(OOP)。作为列表,对象r有可以以这种方式调用的方法函数。对于这篇教程不需要关于面向对象编程的更多知识,只需要理解这种符号。
不同的字符语法(单引号、双引号或三个引号):
如果在字符中要是使用引号,那么应该嵌套使用,或者使用"\"进行转义,否则会报错。
换行的符号为 \n,tab符号是\t。
字符也是类似与列表的结合。因此,也可以使用相同的语法和规则索引和切片。
(记住负索引从右侧开始计数。)
a[::3] # 从开始到结尾,每隔3个字母
字符是不可变对象,不可能修改内容。不过可以从原始的字符中创建一个新的字符。
字典本质上是一个映射键值的高效表格。它是一个无序的容器
一个字典的键(代表值)可以有不同的类型:
元组本质上是不可变列表。元组的元素用括号包起来,或者只是用逗号分割:
集合:无序,惟一项目:
赋值语句被用于(重)绑定名称与值,以及修改可变对象的项目或属性。
简单来说,它这样工作(简单赋值):
-
右侧表达式被评估,创建或获得产生的对象
-
左侧的名字被赋值或绑定到右侧的对象
与上一个id相同,你的可能有所不同...
-
这里的关键观点是可变 vs. 不可变
-
可变对象可以在原地修改
-
不可变对象一旦被创建就不可修改
更多内容在David M. Beazley的文章Python中的类型和对象中也可以找到关于以上问题非常不错的详尽解释。
小技巧:在你的Python解释器内输入下列行,并且注意保持缩进深度。IPython shell会在一行的 : 符号后自动增加缩进,如果要减少缩进,向左侧移动4个空格使用后退键。按两次回车键离开逻辑块。
在脚本中也是强制缩进的。作为练习,在condition.py脚本中以相同的缩进重新输入之前几行,并在IPython中用run condition.py
执行脚本。
但是最经常使用,也更易读的是在值上迭代:
continue 继续下一个循环迭代:
测试同一性:两边是相同的对象:
对于任何集合b:b包含a
如果b是字典,这个语法测试a是否是b的一个键。
你可以在任何序列上进行循环(字符、列表、字典的键,文件的行...):
很少有语言(特别是科学计算语言)允许在整数或索引之外的循环。在Python中,可以在感兴趣的对象上循环,而不用担心你通常不关心的索引。这个功能通常用来让代码更易读。
警告:改变正在循环的序列是不安全的。
通常任务是在一个序列上循环,同时跟踪项目数。
- 可以像上面,使用带有计数器的while循环。或者一个for循环:
注意:函数块必须像其他流程控制块一样缩进
注意:默认函数返回None
。
注意:注意定义函数的语法:
-
接下来是函数的名称,然后
-
在冒号后是在括号中的函数的参数。
-
以及可选返回值的返回对象
可选参数(关键词和命名参数)
关键词参数允许你设置特定默认值。
警告:默认值在函数定义时被评估,而不是在调用时。如果使用可变类型(即字典或列表)并在函数体内修改他们,这可能会产生问题,因为这个修改会在函数被引用的时候一直持续存在。
在关键词参数中使用不可变类型:
在关键词参数中使用可变类型(并且在函数体内修改它):
更复杂的例子,实现Python的切片:
关键词参数的顺序不重要:
但是,最好是使用与函数定义相同的顺序。
关键词参数是特别方便的功能,可以用可变数量的参数来定义一个函数,特别是当函数据绝大多数调用都会使用默认值时。
可以在一个函数内部改变变量的值吗?大多数语言(C、Java...)区分了“值传递“和”引用传递“。在Python中,没有严格的这种区分,并且视你的变量是否会修改而有一些不同。幸运的是,这些情况存在明确的规则。
函数的参数是对象的引用,传递的是值。当你像一个函数传递了一个变量,Python传递的是对象的引用,这个对象引用的变量(值)。而不是变量本身。
如果值传递给函数的值是不可变的,那么这个函数并不会改变调用者的变量。如果值是可变的,那么函数将可能在原地修改调用者的变量。
在函数外定义的变量可以在函数内引用:
但是,这些全局变量不能在函数内修改,除非在函数内声明global。
- *args:封装成元组的任意数量的位置参数
- **kwargs:封装成字典的任意数量的关键词参数
关于函数作用及参数的文档。通常惯例:
函数是一级对象,这意味着他们可以是:
- 可以被赋值给变量
- 列表的一个项目(或任何集合)
- 作为参数传递给另一个函数
方法是对象的函数。你已经在我们关于列表、字典和字符等...的例子上看到了。
写一个函数来展示斐波那契数列的前n个项目,定义如下:
实现快速排序算法,定义来自wikipedia: