Python是一门脚本语言,我也久闻大名,但正真系统的接触学习是在去年(2013)年底到今年(2014)年初的时候。不得不说的是Python的官方文档相当齐全,如果你是在Windows上学习Python,安装包自带的“Python Manuals”就是一份很好的学习资料(基本上不用去找其他资料了);尤其是其中的Tutorial,非常适合初学者。本文一方面总结了python语言的核心——数据类型和控制结构;另一方面,通过与其他语言的对比表达了我对Python的一些拙见。

数据类型

Python简洁的背后是因为有着强大的类型系统的支持。Python世界的基本数据类型有{int, long, float, complex, str, list, set, tuple, dict},下面通过Python解释器在交互模式下的输入输出实例进行演示(其中有前导符>>>或...的是输入):
tips: Python世界里,可以用type(x)来输出x的类型.

int, long, float, str, complex

  1. >>> type(123)
  2. <type 'int'>
  3. >>> type(-234)
  4. <type 'int'>
  5. >>> type(123456123456)
  6. <type 'long'>
  7. >>> type(-123456123456)
  8. <type 'long'>
  9. >>> type(123.456)
  10. <type 'float'>
  11. >>> type('abc')
  12. <type 'str'>
  13. >>> type("hello, world")
  14. <type 'str'>
从最后两次输入可以看到Python的字符串可以用单引号也可以用双引号。另外,大家可能会疑惑的是到底多大是int和多大是long呢?下面我们来一探究竟:
  1. >>> type(123456)
  2. <type 'int'>
  3. >>> type(123456789)
  4. <type 'int'>
  5. >>> type(1234567890)
  6. <type 'int'>
  7. >>> type(12345678901)
  8. <type 'long'>

可以看到1234567890还是int,12345678901就是long了,说明int是有范围的。记得C/C++的int长度(4B)的同学都知道,C/C++里int的取值范围是:[-2^31, 2^31-1]也就是[-2147483648, 2147483647]。据此,我们可以看看Python的int范围:

  1. >>> type(2147483647)
  2. <type 'int'>
  3. >>> type(2147483648)
  4. <type 'long'>
  5. >>> type(-2147483648)
  6. <type 'int'>
  7. >>> type(-2147483649)
  8. <type 'long'>

这次试验说明,Python的int范围和C/C++一样。(事实上和long一样,这里只是因为运行的是32位的python解释器,如果是64位python解释器,int是8字节)

那么,如果我想指定一个比较小的long怎么办呢?可以通过加L(或小写l)后缀:
  1. >>> type(1L)
  2. <type 'long'>
  3. >>> type(2l)
  4. <type 'long'>
另外,Python的浮点数是没有double的:
  1. >>> type(123.456)
  2. <type 'float'>
  3. >>> type(123456123456.123456123456123456123456)
  4. <type 'float'>
 

complex(复数)

复数类型在很多语言中是没有的,Python通过整数加J(或小写j)后缀表示复数:
  1. >>> type(3+4j)
  2. <type 'complex'>
  3. >>> type(3+4J)
  4. <type 'complex'>
  5. >>> type(4j)
  6. <type 'complex'>
  7. >>> type(j)
  8. Traceback (most recent call last):
  9. File "<stdin>", line 1, in <module>
  10. NameError: name 'j' is not defined
  11. >>> type(1j)
  12. <type 'complex'>

但是1j不允许直接写成j,j会被当做name查找,如果没找到就会报错。

 

tuple, list, set, dict

tuple, list, set, dict分别是元组、列表、集合、字典(有的语言叫映射map)。这些类型才是Python类型系统的过人之处,在多数编译型语言(C、C++、Java、C#等)中,这些类型都要通过库来提供(如C++、Java、C#),有的或许库也没有提供(如C)。
  1. >>> type([1, 2, 3])
  2. <type 'list'>
  3. >>> type({2, 3, 4})
  4. <type 'set'>
  5. >>> type((3, 4, 5))
  6. <type 'tuple'>
  7. >>> type({'key1': 'value1', 'key2': 'value2'})
  8. <type 'dict'>

可以看到(), [], {}和它括起来的一系列元素,分别是表示:元组、列表、集合。而dict则是{key1: value1, [key2: value2, ...]}的形式。

上面列出的各种集合的元素类型一致,这在编译型语言里通常是必须的,但在Python里不必:
  1. >>> (1, 'two', 3.0)
  2. (1, 'two', 3.0)
  3. >>> [(1, 'two', 3.0), '4', 5]
  4. [(1, 'two', 3.0), '4', 5]
  5. >>> {1, 2L, 3.0, 4j}
  6. set([1, 2L, 3.0, 4j])
  7. >>> {1: 'one', 'one': 1}
  8. {1: 'one', 'one': 1}

控制结构

结构化程序设计方法提出之时,就有前辈证明了任何算法都可以使用:顺序、选择、循环三种结构表达。下面将展示Python的基本语法,以及选择和循环。
 

顺序结构

顺序结构本身没什么好说的,这里介绍一下Python的其他特性。

语句

Python的语句以换行符结尾(不像C家族的分号结尾):
  1. >>> print "hello, world"
  2. hello, world

并且Python程序没有所谓的“入口”,这和多数脚本语言类似。

 

弱类型

Python是弱类型的,也就是变量的类型不是一成不变的。这也和很多脚本语言类似。
  1. >>> a = 123
  2. >>> b = "asdf"
  3. >>> c = [3, 4, 5]
  4. >>> a
  5. 123
  6. >>> b
  7. 'asdf'
  8. >>> c
  9. [3, 4, 5]
  10. >>> a = b
  11. >>> b
  12. 'asdf'
这段交互中有两点与C语言(C++等)不同:
  1. 使用变量前不用向提前声明变量的类型
  2. 一个变量初始化为一个类型后还能给他赋其他类型的值
提示:在Python解释器的交互模式下直接输入变量名也能显示变量的值
“变量”一词在Python里应该叫“名字”(或者符号)更确切,在Python中你可以给一个符号赋予任何类型的值。稍后你将会看到可以给原本赋值为int的对象赋值为一个函数,一个类。
 

函数

Python的函数定义以def开始,如果有返回值需要用return传递返回值。
比如如下代码定义了一个名为sayHello的函数,并用'Jack'为参数进行了一次调用:
  1. def sayHello(name):
  2. print 'Hello, ' + name + '!'
  3.  
  4. sayHello('Jack')

这段代码的运行结果为:Hello, Jack!

(可将这段代码保存为sayHello.py,然后在对应目录运行python sayHello.py)
 

Python的类定义以class开始,属性可以在class下方声明也可以在__init__方法里通过self.xxx隐式声明。
先来一段最简单的关于类的代码:
  1. class Man:
  2. def __init__(self, name):
  3. self.name = name
  4.  
  5. def hello(self):
  6. print 'Hello, ' + self.name + '!'
  7.  
  8. m = Man('Jack')
  9. m.hello()

这段代码也会输出:Hello, Jack!

tips: Python方法的第一个参数必须是名为self的参数,用于操作对象的成员。__init__类似其他语言的”构造方法“。
类的更多特性和OOP有关,以后有时间再单独发一篇博文展示。
 
顺便看看函数、类以及类的实例在Python解释器眼中都是什么:
  1. >>> type(sayHello)
  2. <type 'function'>
  3. >>> type(Man)
  4. <type 'classobj'>
  5. >>> type(m)
  6. <type 'instance'>
  7. >>> type(m.hello)
  8. <type 'instancemethod'>
  9. >>> type(Man.hello)
  10. <type 'instancemethod'>

可以想象,Python世界里的东西都是”灰色“的,解释器对它们”一视同仁“,从来不以貌取人,只看他们现在身上的标签是什么~

 

选择结构

Python的选择结构以if开始。

bool

if必然要涉及bool值,Python bool的取值为True和False:
  1. >>> type(1==1)
  2. <type 'bool'>
  3. >>> type(True)
  4. <type 'bool'>
  5. >>> type(False)
  6. <type 'bool'>
(上面好像忘了列出bool类型)
 

对于Number(int, long, float, complex),0在if条件上也是False:

  1. >>> if 1:
  2. ... print "true"
  3. ...
  4. true
  5. >>> if 0:
  6. ... print "true"
  7. ... else:
  8. ... print "false"
  9. ...
  10. false
  11. >>> if 0.0:
  12. ... print "0.0 is true"
  13. ...
  14. >>> if 0j:
  15. ... print "0j is true"
  16. ...

提示:Python是以代码缩进区分代码块的
除此之外,空的string和空的集合(tuple, list, set)也是False:

  1. >>> if '':
  2. ... print 'null string is true'
  3. ...
  4. >>> if ():
  5. ... print 'null tuple is true'
  6. ...
  7. >>> if []:
  8. ... print 'null list is true'
  9. ...
  10. >>> if {}:
  11. ... print 'null set is true'
  12. ...

if, if-else & if-elif-else

上面几个if示例多是只有一个分支的,当然Python也支持多个分支的if:
  1. >>> x = int(raw_input("Please enter an integer: "))
  2. Please enter an integer: 42
  3. >>> if x < 0:
  4. ... x = 0
  5. ... print 'Negative changed to zero'
  6. ... elif x == 0:
  7. ... print 'Zero'
  8. ... elif x == 1:
  9. ... print 'Single'
  10. ... else:
  11. ... print 'More'
  12. ...
  13. More

循环结构

Python的循环有for和while两种,没有do-while,也没有loop-until。
 

for

Python的for循环和C的不同,它更像C++,Java里的新式for循环:
  1. >>> a = [1, 'two', 3.0]
  2. >>> for i in a:
  3. ... print i
  4. ...
  5. 1
  6. two
  7. 3.0

这种for迭代集合很方便。

 
但是要想像典型C语言的for循环那样迭代一个整数区间怎么办?别怕,Python提供了内置(built-in)函数range(),它能返回整数区间列表,供你迭代,用起来也很方便:
  1. >>> for i in range(1, 6):
  2. ... print i
  3. ...
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. >>> for i in range(10, 65, 10):
  10. ... print i
  11. ...
  12. 10
  13. 20
  14. 30
  15. 40
  16. 50
  17. 60

这里展示了range的两种调用形式,一种是range(a, b),它将返回一个从a(包含a)到b(不包含)的整数列表(list),另一种range(a, b, s),将返回一个a~b,以s为步长的list:

  1. >>> range(1, 6)
  2. [1, 2, 3, 4, 5]
  3. >>> range(10, 65, 10)
  4. [10, 20, 30, 40, 50, 60]

while

Python的while循环和C的while差不多:
  1. >>> i = 1
  2. >>>
  3. >>> while i < 5:
  4. ... i = i+1
  5. ... print i
  6. ...
  7. 2
  8. 3
  9. 4
  10. 5

顺便一提,Python里 i=i+1 不能写成i++,Python不支持这种语法;但可以写成 i += 1:

  1. >>> i
  2. 5
  3. >>> i += 1
  4. >>> i
  5. 6
  6. >>> i++
  7. File "<stdin>", line 1
  8. i++
  9. ^
  10. SyntaxError: invalid syntax
  11. >>> ++i
  12. 6
  13. >>> i
  14. 6

各位可能会疑惑,为什么++i可以?因为pyhon支持前置的+(正负号)运算,++被当做两次正运算了;同理,+++i,++++i都是一样的;我们可以顺便测一下负号运算:

  1. >>> i
  2. 6
  3. >>> +++i
  4. 6
  5. >>> ++++i
  6. 6
  7. >>> -i
  8. -6
  9. >>> --i
  10. 6
  11. >>> ---i
  12. -6

和想象的结果一致,Great!

输入输出(IO)

当你想动手写点”更有意思“的小程序的时候,你会发现除了三大基本控制结构和数据类型之外,你最需要的可能就是IO功能。
Q: 输出可以用print,那么输入呢?是input吗?
A:input可以,但更多时候需要用的可能是raw_input和readline这两个built-in function,但readline仅适用于Unix平台.
Q:那么input和raw_input有什么区别呢?
A:来看看我和解释器的下面这段交互,看看你能不能自己发现它们的不同。
  1. >>> varA = raw_input('please input:')
  2. please input:Life is too short, you need Python!
  3. >>> varA
  4. 'Life is too short, you need Python!'
  5. >>> type(raw_input('input something:'))
  6. input something:asdf
  7. <type 'str'>
  8. >>> type(raw_input('input something:'))
  9. input something:123
  10. <type 'str'>

A:你看到了,raw_input不论你输入什么都会返回str类型,这也是为什么叫做raw_input的原因。

A: 继续往下,你会看到input:
  1. >>> type(input('input sth:'))
  2. input sth:123
  3. <type 'int'>
  4. >>> type(input('input sth:'))
  5. input sth:asdf
  6. Traceback (most recent call last):
  7. File "<stdin>", line 1, in <module>
  8. File "<string>", line 1, in <module>
  9. NameError: name 'asdf' is not defined
  10. >>> type(input('input sth:'))
  11. input sth:varA
  12. <type 'str'>
  13. >>> input('sth:')
  14. sth:varA
  15. 'Life is too short, you need Python!'
  16. >>> input('try some input like your code:')
  17. try some input like your code:[1, 'two', 3.0]
  18. [1, 'two', 3.0]
  19. >>> input('try again:')
  20. try again:'Oh!!!'
  21. 'Oh!!!'
 

Python 数据类型和控制结构的更多相关文章

  1. Python 30分钟入门——数据类型 and 控制结构

    Python是一门脚本语言,我也久闻大名,但正真系统的接触学习是在去年(2013)年底到今年(2014)年初的时候.不得不说的是Python的官方文档相当齐全,如果你是在Windows上学习Pytho ...

  2. Python 30分钟入门——数据类型 &amp; 控制结构

    Python是一门脚本语言,我也久闻大名,但正真系统的接触学习是在去年(2013)年底到今年(2014)年初的时候.不得不说的是Python的官方文档相当齐全,假设你是在Windows上学习Pytho ...

  3. Python学习笔记(四)Python程序的控制结构

    在学习了 Python 的基本数据类型后,我们就要开始接触Python程序的控制结构,了解 Python 是如何使用控制结构来更改程序的执行顺序以满足多样的功能需求.如果有的小伙伴在之前学过C语言,j ...

  4. python 数据类型---布尔型& 字符串

    python数据类型-----布尔型 真或假=>1或0 >>> 1==True True >>> 0==False True python 数据类型----- ...

  5. Python 数据类型及其用法

    本文总结一下Python中用到的各种数据类型,以及如何使用可以使得我们的代码变得简洁. 基本结构 我们首先要看的是几乎任何语言都具有的数据类型,包括字符串.整型.浮点型以及布尔类型.这些基本数据类型组 ...

  6. day01-day04总结- Python 数据类型及其用法

    Python 数据类型及其用法: 本文总结一下Python中用到的各种数据类型,以及如何使用可以使得我们的代码变得简洁. 基本结构 我们首先要看的是几乎任何语言都具有的数据类型,包括字符串.整型.浮点 ...

  7. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  8. Python学习笔记(五)--Python数据类型-数字及字符串

    Python数据类型:123和'123'一样吗?>>> 123=='123'False>>> type(123)<type 'int'>>> ...

  9. python数据类型之元组、字典、集合

    python数据类型元组.字典.集合 元组 python的元组与列表类似,不同的是元组是不可变的数据类型.元组使用小括号,列表使用方括号.当元组里只有一个元素是必须要加逗号: >>> ...

随机推荐

  1. Java下载HTTP URL链接示例

    这里以下载迅雷U享版为例. 示例代码: package com.zifeiy.snowflake.handle.filesget; import java.io.File; import java.i ...

  2. Spring Boot使用监听器Listener

    之前介绍了在Spring Boot中使用过滤器:https://www.cnblogs.com/zifeiy/p/9911056.html 接下来介绍使用监听器Listener. 下面是一个例子: p ...

  3. 【c# 学习笔记】为什么要使用委托

    上一章中我们可能会很疑惑,为什么需要委托?为什么不直接在MyMethod方法里直接调用Add方法,反而要实例化一个委托对象来完成调用呢?这岂不是自找麻烦吗? 当然,c#引入委托并不是自找麻烦.委托是c ...

  4. Ubuntu构建LVS+Keepalived高可用负载均衡集群【生产环境部署】

    1.环境说明: 系统版本:Ubuntu 14.04 LVS1物理IP:14.17.64.2   初始接管VIP:14.17.64.13 LVS2物理IP:14.17.64.3   初始接管VIP:14 ...

  5. 做了一个非竞价排名、有较详细信息的程序员职位 match 网站

    作为一个程序员,每次看机会当我去 BOSS 直聘 或者拉勾网进行搜索时,返回的顺序并不是根据匹配程度,而是这些公司给 BOSS 直聘或者拉勾网付了多少钱.这种百度式的竞价排名机制并没有把我做为求职者的 ...

  6. 【VS开发】【数据库开发】windows下libevent x64库静态编译

    按照libevent的文档,使用VC的nmake -f Makefile.nmake即可编译32位release模式.因为项目中要求编译64位的版本,需要在Makefile.nmake中添加一个LIB ...

  7. windows下进程与线程

    windows下进程与线程 Windows是一个单用户多任务的操作系统,同一时间可有多个进程在执行.进程是应用程序的运行实例,可以理解为应用程序的一次动态执行:而线程是CPU调度的单位,是进程的一个执 ...

  8. DDS工作原理及其性能分析

    DDS工作原理及其性能分析 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电路设计等硬件方面的 ...

  9. opencv根据摄像头名称获取索引值

    OpenCV的VideoCapture是一个视频读取与解码的API接口,支持各种视频格式.网络视频流.摄像头读取. 针对一般摄像头的读取,opencv为了实现跨平台读取摄像头时是使用的摄像头索引, V ...

  10. 学习笔记:oracle学习一:oracle11g体系结构之物理存储结构

    目录 1.物理存储结构 1.1 数据文件 1.2 控制文件 1.3 日志文件 1.3.1 重做日志文件 1.3.2 归档日志文件 1.4 服务器参数文件 1.4.1 查看服务器参数 1.4.2 修改服 ...