print "hello world"
^
SyntaxError: invalid syntax
安装配置好了Python3.3后,即在cmd下输入“python”启动交互式命令行窗口,输入《Python开发技术详解》上的一个语句:print "hello world",结果就出现了上面这个错误,出师不捷,还好在百度上一下就搜到答案,原因如下:
查看3.0文档:http://docs.python.org/release/3.0.1/whatsnew/3.0.html,发现从3.0开始print改成了
print()。文档是这样写的:The print statement has been replaced with a print() function, with keyword arguments to replace most of the special syntax of the old print statement (PEP 3105).
print语句被print()方法代替,旧print语句中的特定的语法被参数代替。
所以呢,hello world!应该写成这样:print ("hello world!")
2、failed to set __main__.__loader__
建立并运行helloworld.py实例出现了上述这个异常,百度下,原因如下:
helloworld.py文件路径中包含非英文字符,将hello.py放到纯英文路径下就没问题了。
对于eclipse下使用PyDev的情况,可以用File->Switch Workspace的方法来切换到一个英文路径工作空间目录
3、EditPlus运行Python程序
现把他运行Python程序的方法贴出来,首先得安装python,然后打开editplug3,工具——配置用户工具——组名称随便写个后点添加选应用程序,
菜单文本:python
命令:C:\Python31\python.exe(你自己实际安装python的目录)
参数:选择向下的箭头--“文件路径”
初始目录:“文件目录”
捕获输出:开启
确定即可,然后运行程序的时候只需点工具--python就开始运行了
4、EditPlus中新建Python的模板
在新建的python源文件开头中我们每次可能都要写:
#!usr/bin/python
# -*- coding:utf-8 -*-
第一句是可以使该文件可以在linux和Unix下运行,这可能是必须的,因为考虑到python的跨平台性。
第二句是指定源文件的编码格式,utf-8是支持中文的,很符合国人的习惯,至少你会使用中文的注释吧!
有这样的需求的话我们就可以在EditPlus中设置代码的模板,使得在每次新建文件时这两句会自动添加到文件的开头。
PS:在python2.x 中若将# -*- coding:utf-8 -*-改成#coding:utf-8种形式的话,原则上是可行的,但是在python 2.x 中如果改成这种形式就必须将其放到第一行。在python3.x 中则是没有任何问题。所以为了兼容python2.x和python3.x 推荐大家使用我在上面写的模板。
[http://liujiachang.blog.51cto.com/3524138/1075626]
5、Python中的变量
Python中的变量不需要声明,变量的赋值操作就是变量声明和定义的过程。每个变量在内存中创建时,都包括变量的标识、名称和数据这些信息。
Python中一次新的赋值,将创建一个新的变量。即使变量的名称相同,变量的标识并不相同。例如:
x = 1
pirnt ( id(x) )
x = 2
print ( id(x) )
id函数用于输出变量的标识,每个变量都有一个内部标识,便于变量的维护和管理。会发现,两次输出的x的标识是不同的,说明这个两个变量并不是同一个变量,这一点和C/C++有很大不同。
如果变量y没有赋值,Python将认为该变量不存在。但是我做了下面的实验:
y
print ( y )
同样,也会报错“y未定义”,想是不是Python中没有变量声明一说。
在Python中,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
6、全局变量
做了如下的例子:
_a = 1
_b = 2
def add ():
global _a
_a = 3
return "_a + _b = ", _a + _b
这里的golbal用于引用全局变量。_a = 3 是对全局变量_a的重新赋值。因为C/C++的思维影响,原本觉得此处引用了_a是不是和全局变量_a是同一个变量了,这里的_a=3赋值是不是和“5.Python中的变量”中的所述不同了呢,做了以下实验:
_a = 1
_b = 2
print ( id(_a) )#1
def add ():
global _a
print ( id(_a) ) #2
_a = 3
print ( id(_a) ) #3
return "_a + _b = ", _a + _b
结果是,前两个值相同,但第三个值却不相同。这貌似和“5.Python中的变量”中的所述统一了,但让我对全局变量的实现机制更模糊了,还需要继续体会。
7、长整型long
Python 3.x去除了long类型,只有一种整型:int,但它的行为就像2.X版本的long。
8、三引号
三个连续的单引号,或者三个连续的双引号,但前后必须一致,不能一边是三单引号,一边是三双引号。
两个知识点:其一、三引号是多行字符串,也就是说三引号中字符串可以直接输入单引号、双引号、换行,而不需要转义,例如:
a="abcd #回车会出错
b = """abcd
#这里是回车
efgh""" # 回车,这样就可以
其二、三引号的另一种用法是制作文档字符串。Python的每个对象都有一个属性__doc__,这个属性用于描述该对象的作用:
class Hello:
'''hello class'''
def printHello ():
'''print helloworld'''
print ("hello world!")
print (Hello.__doc__)
print (Hello.printHello.__doc__)
9、SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xca in position 0: invalid continuatin byte
在EditPlus中试下面这个例子时出现了这个错误:
number = input("输入几个数字,用逗号分隔:").split(",")
print (number)
x = 0
while x < len(number):
print (number[x])
x += 1
按说是对着样例照打的,也考虑了2.x到3.x可能改变的地方,但还是不知道是什么原因,错误当然是第一行中的中文的问题,但到底什么原因却不太清楚。而Py3.x源码文件默认使用utf-8编码,因此中文按说应该是可以的。上网搜了半天,终于在这里找到了原因:
当前脚本文件所用的编码,果然,用的是默认的ANSI,而不是utf-8的编码.
顺便网上看了一下Python中的中文错误问题,貌似还是个老问题了。关于Python、编码、中文的问题,这里谈的挺好的。
10、Python不同版本中print不换行的问题
python中的print默认是换行的,想要不换行输出,需要一些特殊的方法,而在2.x和3.x中处理的方法又是有些不同的。大致方法如下:
2.x中,一般的是在print尾部加上逗号(,)
3.x中,上述方法则不行,需要使用在print尾部添加如下代码:end = "XXX" (XXX= , . ; '或者一个字符、字符串)
11、Python 3.x对map函数的修改
map()函数现在返回一个迭代器。(在Python 2里,它返回一个列表。)
Notes | Python 2 | Python 3 |
① | map(a_function, 'PapayaWhip') | list(map(a_function, 'PapayaWhip')) |
② | map(None, 'PapayaWhip') | list('PapayaWhip') |
③ | map(lambda x: x+1, range(42)) | [x+1 for x in range(42)] |
④ | for i in map(a_function, a_sequence): | no change |
⑤ | [i for i in map(a_function, a_sequence)] | no change |
12、Python 内置模块的函数
常用的内联函数如下表所示(3.x中删除的函数不再列出)
函数 | 说明 |
abs ( x ) | 返回x的绝对值 |
bool ( [x] ) | 把一个值或表达式转换成bool类型,如果表达式x为真,返回true 否则,返回false |
cmp ( x, y) | 比较x,y的大小 |
delattr ( obj , name) | 等价于del obj.name |
eval ( s [ , globals [ , locals]]) | 计算表达式的值 |
float ( x ) | 把数字或字符串转换为float类型 |
hash ( object ) | 返回一个对象的hash值 |
help ( [object] ) | 返回内联函数的帮助说明 |
id ( x ) | 返回一个对象的标识 |
input ( [prompt] ) | 接受控制台的输入,返回字符串类型 |
int ( x ) | 把数字或字符串转换成整型 |
len ( obj ) | 对象包含的元素个数 |
range ( [start , ] end [ , step ] ) | 返回一个迭代器 |
reduce ( func, sequence [ , initial] ) | 对序列的值进行累计计算。在Python 3里,reduce从全局名字空间里移除, 现在被放置在fucntools模块里,可以使用from functools import reduce加载 |
round ( x , n = 0) | 四舍五入函数 |
set ( [iterable] ) | 返回一个set集合 |
sorted ( iterable [ , cmp [ , key [ , reverse ] ] ] ) | 返回一个排序后的列表 |
sum ( iterable [ , start = 0] ) | 返回一个序列的和 |
type ( obj ) | 返回一个对象的类型 |
zip ( seq1 [ , seq2 , ...]) | 把n个序列作为列表的元素返回 |
13、python中的三个重要概念:名字、绑定和对象
看到讲使用函数的默认参数会出现一些预期之外的结果时,着实越看越糊涂了,网上搜一下,看到一篇博文《python的对象与名字绑定》,讲的非常好,已转载为我的下一篇博文,对于理解python中的三个重要概念:名字、绑定和对象,以及python的思想和一些内部实现机制都很有帮助。详情见下一篇博文。
14、pass
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作,比如:
while False:
pass
pass通常用来创建一个最简单的类:
class MyEmptyClass:
pass
pass在软件设计阶段也经常用来作为TODO,提醒实现相应的实现,比如:
def initlog(*args):
pass #please implement this
15、del
看这个例子:
>>> x = 1
>>> del x
>>> x
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
x
NameError: name 'x' is not defined
>>> x = ['Hello','world']
>>> y = x
>>> y
['Hello', 'world']
>>> x
['Hello', 'world']
>>> del x
>>> x
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
x
NameError: name 'x' is not defined
>>> y
['Hello', 'world']
>>>
可以看到x和y指向同一个列表,但是删除x后,y并没有受到影响。这是为什么呢?这是因为在python中删除只是删除名称(或称标识符)、而不是删除其引用的值,在python中没有删除值的方法,事实上也不需要这么做,因为python解释器在值(对象)的引用计数为0时会自动删除该值。
16、Generator函数
书上对Generator函数与yield介绍的非常简单,就简单的说Generator函数的功能是每次返回一个数据项,而其使用方法是在函数体内使用yield生成数据项即可。但我觉得它的使用广度和原理远不止这么简单,故在网上搜了一下,确实发现了它很多研究的地方。
主要是:《2.5版yield之学习心得》,《Python 深入理解yield》。
17、