对于多数从其他编程语言转入Python的来说,或多或少会有些不习惯。如果沿用其他编程语言的语法来写Python代码,那么碰壁是不可避免的了。
本文是基于我看了两个小时的官方文档(Python 2.7 : https://docs.python.org/2/tutorial/index.html , 至于我学习Python2.x的原因:工作需要),
从中提取的重要的细节,以避免再次踩坑。
先上一个Python文件(Foo.py):
#!python # -*- coding: utf-8 -*- ''' python 的注释: 多行注释: 用成对的3个单引号或者3个双引号组成 (例如当前位置) 单行注释:使用# ''' # 定义一个foo函数,用于把指定msg打印 count次 """ params: count: int, 打印的次数 msg: string,消息内容 useFor:多次打印时,是否采用for loop。 raise: ValueError : 当count<0时抛出 """ def foo(count=1, msg='Hello'+' '+ "Foo", useFor=1): if count < 0 : raise ValueError('count < 0') if useFor : # 0,1 可以用作bool判定 print("print use for, count = " + bytes(count) +" :") for i in range(count): # range(N),会生成一个从0到N的list,恰好可以用作索引 print(msg+' '+bytes(i)) else: print("print use while, count = " + bytes(count)+" :") i = 0 while i < count: print(msg+" "+bytes(i)) i+=1 # python中不支持 i++的写法,支持 i+= 的写法 if __name__ == '__main__' : print('main in Foo.py') foo(2,useFor=1) foo(useFor=0, count=3); foo(-1)
1、文件头
作为一个脚本语言,文件头指定一些执行环境等,是很常见的事情。在shell中就很常见的。
那么对于Python脚本,也有同样的内容:
1.1 指定解释器
脚本语言,很常见的配置:
#!/bin/sh shell脚本 #!/usr/bin/perl perl脚本 #!/usr/bin/python python脚本 #!/usr/bin/python3 python3脚本 #!/usr/bin/python2 python2脚本 而有时不太清楚脚本解释器的具体全路径名;或者开发环境与运行环境的安装路径不同。为了保证兼容性,也可以写作: #!/usr/bin/env python3
这样运行时会自动搜索脚本解释器的绝对路径。
1.2 指定文件编码
py文件的默认编码是ASCII,上面的脚本中很多都是ASCII不支持的,那么需要指定文件编码。格式是:
#-*- coding: encoding -*-
2、注释
python 的注释:
多行注释: 用成对的3个单引号或者3个双引号组成 (例如当前位置)
单行注释:使用#
3、代码块,缩进
代码块:从上面的Foo.py文件中,很容易可以看出,代码块是以 冒号 : 开始的。不论是function定义,if,else,还是loop(for, while)
都是用 : 作为代码块的开始。不是用 { } 来包括代码块的。
缩进:Python的程序中,不是用 { } 来包括代码块的,用缩进来维持代码块的。不要写 tab,用4个空格为缩进。
4、基本数据类型
4.1 String
Python中的字符串与JavaScript中的字符串一样,既可以使用单引号,也可以使用双引号。
不会像Shell那样具备转义。如果需要对字符转义,使用 ,如果你不想要 字符串内部的 代表转义,那需要在第一个引号前加上 r 。例如:
#!python #-*- coding: utf-8 -*- ''' Python String, 1)表示字符串:用单引号或者双引号。他们是等价的,不存在取值转义等问题 2)字符串内的表示转义 3)如果不希望字符串内的表示转义,需要在字符串前加上 r 。 4)判定两个字符串是否相等,类似于JavaScript,用 == 即可
5)两个字符串拼接,使用 + 即可
6)String 与 Number 拼接,不能直接使用 +
'''
def testString(): a = 'aaa' b = "aaa" print(a==b) print(a==b) c = " " d = r" " print(c) print(d) print(c == d) if __name__ == '__main__' : print('current module name is "' + __name__+'"') testString()
4.2 Number
#!python #-*- coding: utf-8 -*- ''' Python String, 1)对于数字,Python与JavaScript仍然是类似的,没有那么多的限制 2)可以在数字上直接进行 + - * / 运算 3)String 与 Number 拼接,不能直接使用 + ''' def testNumber(): a = 1 # int b = 1.0 # float c = 1.1 print(a==b) print(b<c) print(a + (b - c * 3) / 2 ) d = "1" print(a == d) print(bytes(1)+d)
4.3 Boolean
类似于JavaScript,Python的boolean也是多变的。
True, False 分别表示真、假
以下几种情况是false:
1.None
2.False
3.任何类型的数字0,包括0,0.0,0L,0j
4.空的序列(sequence)或者映射(mapping)类型对象
5.对于用户自定义类型的对象,如果其类定义了__nonzero__() 或者 __len__()特殊方法并且返回False或者0
对于最后一条规则,有几点需要说明:
1.如果类没有定义这两个方法中的任何一个,则这种类型的对象真值测试时总是为True
2.如果类同时定义了__nonzero__() 和 __len__(),只会参考__nonzero__()的返回值
以下几种情况是false:1.None2.False3.任何类型的数字0,包括0,0.0,0L,0j4.空的序列(sequence)或者映射(mapping)类型对象5.对于用户自定义类型的对象,如果其类定义了__nonzero__() 或者 __len__()特殊方法并且返回False或者0
对于最后一条规则,有几点需要说明:1.如果类没有定义这两个方法中的任何一个,则这种类型的对象真值测试时总是为True2.如果类同时定义了__nonzero__() 和 __len__(),只会参考__nonzero__()的返回值
def testBoolean(): a = True b = False print(a!=b) if(3): print("3 is True") if __name__ == '__main__' : print('current module name is "' + __name__+'"') testBoolean()
5、 变量
Python中的变量,可以分为 local variable, global variable。
1)local variable 的作用与在一个代码块内部
2)global variable 的作用与在一个Python的module (一个 py文件) 内。它属于模块对象的。如果 A module 中定义了 一个global 变量 a, B module import 了 A, B仍然不能直接使用 A模块的global 变量 a(例如不能 print a),而应该通过 A.a来使用。
声明 global 变量需要使用 global 关键字,且有两步,先声明后赋值。
声明local 变量,不需要额外的关键字。
#!python #-*- coding: utf-8 -*- ''' 全局变量 ''' global moduleName moduleName = __name__ a = 1 def printModuleName(): print(a+1) print(__name__) print(moduleName) ''' if __name__ == '__main__' : print('current module name is "' + __name__+'"') ''' printModuleName() print(a)
6、异常捕获与处理
Java中的try ... catch .. finally,在Python中也有类似的处理机制:try ... except ... else ... finally ...
7、参数 * 与 **
在Python中,可变参数用 *表示,本质是有个tuple。 keyworld参数用 **表示