Python学习笔记---不断更新---

1、 File "<stdin>", line 1
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里,它返回一个列表。)

NotesPython 2Python 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
[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、


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值