一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1858|回复: 12
收起左侧

[学Python/Perl] The Little Python

[复制链接] |试试Instant~ |关注本帖
xelatexer 发表于 2014-6-9 18:49:39 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
这是什么?
这是为编程新人写的Python编程帖子。科班出身的同学也不要走,可以点评一下我写的是否准确。

为什么要发这个帖子?
目测地里有很多想转CS的,而编程是CS最重要的事情(没有之一)。本帖就是给编程新手写的教学贴。当然,有一定编程基础的同学也可能有所收获,可能会对以前不理解的概念有明确的认识。

为什么取名叫The Little Python?
很不厚道地说,这是为了模仿《The Little Schemer》的风格。《The Little Schemer》就是Scheme语言的入门书,用很浅显的话语讲述了Scheme编程语言的编程原理。

你打算怎么写这个入门系列?
模仿《The Little Schemer》,写成一问一答的风格。很多同学看到满篇的术语从而对学习CS丧失信心。所以我使用很浅显的语言解释Python程序,术语越少越好。把这个帖子写成系列,先写写开头,看看同学们的反应。如果同学们欢迎,我将接着写下去。同学们的支持是我最大的鼓励。

为什么选择Python?
因为Python语言就是为编程新手设计的。学习Python语言编程时,不用拘泥于机器的细节,只用描述计算过程。同时,输入Python语言后,可以立即运行,立即看到效果,避免了C/C++/Java语言的复杂的处理过程。(其实这一段我本打算加几个术语的,但我还是忍住了没加。从这里可以看出这个帖子的写作风格)


评分

8

查看全部评分

 楼主| xelatexer 发表于 2014-6-10 02:40:53 | 显示全部楼层
赋值与变量

这行程序是什么意思?
  1. x=1
复制代码
等号右侧的运算结果为1,给这个结果取个名字x。

这行程序又是什么意思?
  1. y=1+2
复制代码
等号右侧的运算结果为3,给这个结果取个名字y。

这段程序又是什么意思?
  1. z=1
  2. y=z+1
复制代码
程序有多行时,先执行前面的运算,再执行后面的运算。第一行表示给等号右侧的结果1取个名字z。第二行右侧的z+1表示,首先找出z代表的值,即为1,然后用z的值加上1,得到2,最后将这个运算结果取个名字y。

这是什么运算?
这叫“赋值”运算。

赋值用得着这么解释么?赋值不和数学的等号一样的么?
对于前面的两个例子,你可以把它当作和数学的等号解释。但是后面的例子你很难用数学的等号解释了,虽然赋值运算的符号是等号。

假设x=1,这是什么意思?
  1. x=x+1
复制代码
首先计算等号右侧的x+1。先找出x的值为1,然后将这个值加1,得到2。给这个结果取个名字x。

左右两侧可以用同一个字母么?
可以,例如上一问中左侧的字母恰好取得和右侧的一样。虽然是同一个字母,代表的值不一样。后续的程序,就用最近的值,原先的值就被代替了。

假设a=1,b=2,下面这行程序是什么意思?
  1. a,b=b,a
复制代码
将等号右侧的运算结果2,1,依次取名字a,b。从而得到a=2,b=1(直接说交换a与b的值不就完了么?)。

假设a=1,b=2,c=3,下面这行程序是什么意思?
  1. a,b,c=c,a,b
复制代码
将等号右侧的运算结果3,1,2,依次取名字a,b,c。得到a=3,b=1,c=2。

像上一问的a,b,c之类的字母,叫什么名字?
叫做“变量”,因为它们的值会变。

变量只能有一个字母么?
变量的名字叫做变量名(因为变量包括名字和对应的值,所以不能混淆“变量”和“变量名”)。变量名可以有多个字母,只是字母之间不能有空格。例如variable就是一个变量,它有8个字母。

a1是一个变量名么?
是的,变量名可以包含数字。

1a是一个变量名么?
不是,数字不能放在开头。

_1是一个变量名么?
是的,变量名可以包含下划线_。

while是一个变量名么?
不是,因为while有特殊用途。这种有特殊用途的名字,称为关键字或者保留字(keyword)
回复 支持 1 反对 0

使用道具 举报

 楼主| xelatexer 发表于 2014-6-9 19:17:16 | 显示全部楼层
本帖最后由 xelatexer 于 2014-6-9 19:22 编辑

入门

什么是程序?
程序没什么神秘的,它就是一个计算过程。这里的计算不仅仅指数字的运算,它就是“符号变换“的代名词。例如,把一串字母”cheng xu she ji“变成汉字"程序设计”,就是一个计算过程。

你能举个例子么?
例如南宋时期秦九韶的“大衍求一术”。“置诸元数,两两连环求等,约奇弗约偶,遍约毕,乃变元数,皆曰定母,列右行,各立天元一为子,列左行,以定诸母,互乘左行之子,各得名曰衍数,次以各定母满去衍数,各余名曰奇数,以奇数与定母,用大衍术求一。”(这段话从维基百科上抄的,我也不懂)。

这段文字描述了一个计算的规则,先算什么,后算什么,最后得到什么结果。这就是一个程序。(对CS科班的同学说一句:这里我不严格地区分“算法”和“程序”。在我看来,只要写下来的、明确的、可操作的规则,就是“程序”。而有人认为只有用Python等程序语言描述的计算过程,才是程序;而类似“大衍求一术”的东西,只能叫做“算法”。这里先搁置争议,还是学习Python要紧。)

上面那段程序看不懂,怎么办?
正是因为用文言文写下的计算规则很难懂,计算机更不懂,所以我们使用其他的语言描述这个规则。这里我们使用Python语言。

Python语言如何描述一个计算规则?
首先,Python语言定义了一组基本运算,例如加、减、乘、除和赋值(这是第一个术语,后面再解释)。在这些基本运算的基础上,Python语言提供了将基本的运算组合起来(也就是指明先进行哪个基本运算,再进行哪个基本运算)的方法。编写程序,其实就是合理地安排基本运算及其次序,从而得出想要的结果。

怎么在电脑上运行Python语言?
首先要下载Python语言的相关软件,官方网站传送门 www.python.org。然后打开文本编辑器,如记事本或者Python软件提供的IDLE,输入Python程序,再运行即可。

我去Python网站上看到2.7和3.3两个版本,用哪个?
本文以Python 2.7为准。因为市面上大部分的Python图书都以2.7为准,3.4不成熟,相关的图书、程序较少。不过,我尽量使用2.7和3.4都通用的部分。这样学习3.3也容易。
我等不及了,你赶快教我写第一个Python程序吧?
好的,打开Python,输入
  1. print('hello world')
复制代码
在输入回车。就可以看到那个黑窗口(苹果的是白窗口)里面多了一行hello world。
学习一门语言的第一个程序,肯定是输出hello world。:D




评分

1

查看全部评分

回复 支持 反对

使用道具 举报

pinxinlong 发表于 2014-6-9 19:19:33 | 显示全部楼层
支持LZ,坚持住~
回复 支持 反对

使用道具 举报

 楼主| xelatexer 发表于 2014-6-9 19:32:30 | 显示全部楼层
本帖最后由 xelatexer 于 2014-6-10 02:43 编辑

基本运算

如何用Python进行四则运算?
打开Python(这句话以后就不说了。编程序要熟能生巧,光看我的帖子是不行的)。先计算第一个式子:1+1
  1. 1+1
复制代码
Python返回2,这就是运算结果。
再来一个:2-1
  1. 2-1
复制代码
Python返回1。
再试一个2*3
  1. 2*3
复制代码
Python返回6。
最后试一个4/2
  1. 4/2
复制代码
Python返回2。

为什么我输入8/5,得到1?
Python规定,当除法的两个数都是整数时,运算结果也是整数。去最接近但不大于商的整数作为运算结果。这条规定就是Python手册所说的“地板除”(floor division)。所以,上面的运算相当于数学里面的[8/5]=[1.6]=1。注意,在Python 3.3里面,8/5得到1.6,如果想得到地板除,请用//代替/。

要想得到8/5=1.6,怎么办?
改用下面的程序
  1. 8.0/5
复制代码
或者
  1. 8/5.0
复制代码
或者
  1. 8.0/5.0
复制代码
因为,Python规定,只要四则运算中有一个数是小数,就得出小数运算结果。换句话说,只有当运算符两边的数都是整数时,才返回整数结果。

怎么得到7除以4的小数值?
输入如下程序
  1. 7.0/4
复制代码
怎么得到10除以3的小数值?
输入如下程序
  1. 10.0/3
复制代码
在Python中输入5.0/2,会得到什么结果?
2.5

*为什么要区分整数和小数?(加星号表示这个问题有一定难度,下同)
这个问题问得好。这里简单说明一下。计算机的记忆容量,也就是二进制位数是有限的。在有限的容量内,要么(1)用二进制准确地表示一个数,但牺牲数的范围(只表示整数),这就是整数;(2)用二进制表示范围尽量大的数(例如100000000和0.00001),但牺牲精确度(试试3*1.4就明白了)。总之,精度和范围不可兼得,这是计算机的一个基本限制。

怎么得到2的3次方?
输入
  1. 2**3
复制代码
注意,两个星号必须相连,否则Python将两个星号识别为两次乘法,而不是乘方。

*怎么得到2的平方根?
在Python中,开方不是基本运算。输入如下程序才能得到2的平方根
  1. import math
  2. math.sqrt(2)
复制代码
Python里面怎么输入负数?
在数字前面加上负号-。例如
  1. -2.5
复制代码
Python如何输入复数1+i?(学文科的同学可以跳过此问)
Python使用j或者J作为虚数单位,所以,输入
  1. 1+1j
复制代码
复数除法也分地板除和精确除么?(学文科的同学可以跳过此问)
不分,输入
  1. (1+0j)/2
复制代码
返回0.5+0j而不是0+0j。这是因为,Python规定,运算符两侧只要有一个是复数,结果也是复数。而复数不能比大小,所以没有地板除。

怎么得到复数的实部和虚部?(学文科的同学可以跳过此问)
假如我想得到1+2i的实部,输入
  1. (1+2j).real
复制代码
必须加括号,程序的含义就变成,先求出2i的实部(就是零),再加上1。
得到1+2i的虚部,输入
  1. (1+2j).imag
复制代码
要想令x=1,怎么办?
输入
  1. x=1
复制代码
要想令y=x,怎么办?
输入
  1. y=x
复制代码
注意,等号右边的字母必须有值。

字母可以参与运算么?
可以,但是算式内所有的字母必须有值,不能有未知字母。例如,求1/x在x=2下的值,输入
  1. x=2
  2. 1.0/x
复制代码
Python有科学计数法么?例如,如何表示1乘以10的7次方?
  1. 1e7
复制代码
字母e和E表示“乘以10的多少次方”。注意,e与前后的数字都没有空格。

可以用这样的表示法么?
  1. 1e(1e7)
复制代码
不行,e不是运算符,它是数的一部分。e前面只能写小数和整数,后面只能写整数(包括负整数,但负号必须紧跟e)。
回复 支持 反对

使用道具 举报

laughingvito 发表于 2014-6-10 03:28:25 | 显示全部楼层
LZ,写成一个tutorial啊。
回复 支持 反对

使用道具 举报

anonym 发表于 2014-6-11 15:37:08 | 显示全部楼层
给楼主提个建议 可以写成一个系列 每个贴子一个主题 把这里做成汇总 这样你写起来方便 看的同学也方便
回复 支持 反对

使用道具 举报

 楼主| xelatexer 发表于 2014-6-11 19:06:19 | 显示全部楼层
本帖最后由 xelatexer 于 2014-6-11 19:19 编辑

数据类型

如何查看Python的某个变量(例如x)的值是整数还是小数?
  1. type(x)
复制代码
假设x=1,x是什么类型?
输入type(x)即可得到<type 'int'>,表示它是一个整数。

输入type(1.0)返回<type 'float'>是什么意思?
表示返回的结果是一个类型,这个类型名叫float,就是小数。

为什么叫float?
因为小数的小数位不固定(相比之下,整数的小数点固定在末尾),所以又叫浮点数,在Python里面也叫float。

为什么我输入type(100000000000000000000000000000000000000000)得到long?
因为这个数超过了(普通)整数的范围,所以是长整数,又叫long。

是不是只有非常大的数才是长整数,较小的数就是整数?
不是,所有的整数包含在长整数之内。如果在一个(普通)整数后面加上L,就得到长整数。例如1L就是一个长整数。

如果我要表示复数1+i,可不可以写1+j?
不行,j前面必须有数。否则,这个j就不表示虚数单位,而表示一个变量。

假设a=1,b=2,我想表示复数a+bi,怎么写?
必须写成complex(a,b),不能写成a+bj。因为在Python里,a+bj表示变量a和bj的值相加。只有j前面跟上一个整数,j才表示虚数单位。

同样都是数,为什么非要分成整数、长整数、小数和复数?
因为这四种数的加减乘除的运算方式不一样,所以必须指定使用哪种数,这样才能确定正确的运算方式。

怎么把整数变量x变成小数?
  1. float(x)
复制代码
怎么把小数变量y变成整数?
  1. int(y)
复制代码
注意,转换的方式是截取整数部分。

怎么把小数变量y变成复数?
  1. complex(y)
复制代码
如果我想让这个复数包括实部y和虚部z,怎么办?
  1. complex(y,z)
复制代码
1.0+2为什么得到3.0?
计算时,Python将运算符两侧的数或变量变成同一种类型。左边是小数,右边是整数,先将整数变成小数,再进行运算,结果也是小数。相当于1.0+float(2)。

为什么1.0+(1.0+0j)得到2.0+0j?
因为运算符两侧有一边是复数时,将另外一边转换成复数再计算,相当于complex(1.0)+(1.0+0j)。

为什么float(3/2)的结果是1.0而不是1.5?
float(3/2)的意思是,先计算3/2,再把运算结果转换成小数。由于3和2都是整数,3/2的结果是1,转换成小数后就是1.0。

那怎么得到3/2=1.5?
将运算符两侧的某个数转换成小数,例如
  1. 3.0/2
复制代码
或者
  1. float(3)/2
复制代码
运算符两边的类型不一样,到底转换哪种类型?
这四种数的优先次序依次是复数、小数、长整数、整数。排在后面的转换成排在前面的。

什么是字符串(string)?
字符串就是可以显示在屏幕上(但不一定非要显示在屏幕上)的一段文本。

Python怎么表示字符串?
在字符串的前后都加上单引号或双引号,例如'hello world'和"hello world"。

怎么把字符串显示在屏幕上?
例如我想显示hello world,可以用下面这一行程序
  1. print('hello world')
复制代码
变量的值可以是字符串么?
可以,例如,我把x的值设定为字符串'hello world'
  1. x='hello world'
  2. print(x)
复制代码
既然引号不是字符串的一部分,怎么表示字符串内的引号?
两种办法。第一种:交替使用单引号和双引号。例如,双引号表示字符串的边界,而单引号则是真正的字符
  1. "This isn't a string."
复制代码
第二种,在字符串内的单引号前加上反斜杠\,表示紧跟在反斜杠\后面的一个或几个字符组合在一起,表示一个真正的字符,不能按照字面意义解释。
  1. 'This isn\'t a string.'
复制代码
反斜杠后面还可以紧跟什么字符?表示什么含义?
\n表示换行,\t表示tab键,\\表示”一个“反斜杠,\'表示单引号,\"表示双引号。

假设我的字符串有三个反斜杠\,怎么表示?
  1. '\\\\\\'
复制代码
啊,反斜杠太多了,我都数不清到底表示几个反斜杠,怎么办?
在字符串开头的引号前面加上r或R。例如,可以这样表示三个反斜杠
  1. R'\\\'
复制代码
字符串开头加上R,反斜杠就是反斜杠,不用转换成别的字符。

我的字符串有两行,为什么这样表示是错的?
  1. 'The first line.
  2. The second line'
复制代码
因为字符串的两个单引号必须包含在程序里面的同一行内,除非在行尾加上\。要想表示多行字符串,可以用两种方法。第一种,使用\n表示换行。
  1. 'The first line.\nThe second line'
复制代码
第二种,使用连续的三个引号"""或'''。
  1. '''The first line.
  2. The second line.'''
复制代码
回复 支持 反对

使用道具 举报

hnxy99 发表于 2014-6-13 02:35:45 | 显示全部楼层
写的很好,很适合我这种0基础的。。。感谢楼主
回复 支持 反对

使用道具 举报

Hey_Qian 发表于 2014-6-14 19:35:51 | 显示全部楼层
感谢lz分享~!正好准备学,很有用!!!
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-9 02:57

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表