Python基本语法
1. 定义常量:
因为Python的常量相对其他语言,可能略显麻烦。不仅仅只是单靠const就可以完成常量定义的。在Python中定义常量需要用对象的方法来创建。
我们需要在Lib的目录下创建一个const.py的文件,lib目录下主要是放一些模块的东西。
class _const(object): class ConstError(TypeError):pass def __setattr__(self, name, value): if self.__dict__.has_key(name): raise self.ConstError, "Can't rebind const (%s)" %name self.__dict__[name]=value def __delattr__(self, name): if name in self.__dict__: raise self.ConstError, "Can't unbind const (%s)" %name raise NameError, name import sys sys.modules[__name__] = _const()
这就是一个定义常量对象的方法,Python定义常量首先需要有对象的概念,所以上面我们已经简单了解了对象的定义了。至于上面这个const类呢,大家略看一下就可以了,这种东西百度搜索Python定义常量一大堆。我们只需要在lib文件夹下面建立一个const.py的文件,将上述代码拷贝到const.py文件里。这样使用常量就很方便了。
# encoding=utf-8 import const # 导入常量文件 const.value=3 # 声明常量 print(const.value) const.avc=4 print(const.avc) const.avc=5 # 试图改变常量的值,报错
2. 数的类型:
- 整数型(int) 例:0、6、-2、2015、-203
- 长整型(long) 例:56990l、-12694l、938476l
- 浮点型(float) 例:7.5325、9.434、6.66
- 布尔型(bool) 例:True、False
- 复数型(complex) 例:6+4j、-5+12j、98+9j
complex()函数可以使用参数real(实部) + imag(虚部)*j方式创建一个复数。也可以转换一个字符串的数字为复数;或者转换一个数字为复数。如果第一个参数是字符串,第二个参数不用填写,会解释这个字符串且返回复数;不过,第二个参数不能输入字符串方式,否则会出错。real和imag参数可以输入数字,如果imag参数没有输入,默认它就是零值,这 个函数就相当于int()或float()的功能。如果real和imag参数都输入零,这个函数就返回0j。有了这个函数,就可以很方便地把一个列表转 换为复数的形式。
注意:当想从一个字符串的复数形式转换复数时,需要注意的是在字符串中间不能出现空格,比如写成complex(‘1+2j’),而不是写成complex(‘1 +2j’), 否则会返回ValueError异常。
# encoding=utf-8 print(complex(1)) # 第二个参数不填,默认为0j print(complex("2")) #第一个参数为字符串,第二个参数不用填写,填写报错 print(complex('2')) print(complex('''2''')) print(complex("""2""")) print(complex(" 2+3j ")) # “ 2+3j ”中加号的两边不能有空格否则报错,错误写法"2+ 3j","2 + 3j","2 +3j" print(complex(3,4)) array = [1,3,5,7] for i in array: print(complex(i,i+1))
结果:
(1+0j) (2+0j) (2+0j) (2+0j) (2+0j) (2+3j) (3+4j) (1+2j) (3+4j) (5+6j) (7+8j)
3. 字符串类型:
- 单引号字符串:'hello'
- 双引号字符串:"hello"
- 三引号字符串:"""hello"""或'''hello'''
注:三引号包含的字符串可由多行组成,一般可表示大段的叙述性字符串。在使用时基本没有差别,但双引号和三引号("""...""")中可以包含单引号, 三引号('''...''')可以包含双引号,而不需要转义。
# encoding=utf-8 str0='str0 "str0" """str0"""' # 单引号中使用双引号会被保留下来,不需要转义,但是不能使用单引号 print("str0 {0}".format(str0)) str1="str1 'str1' '''str1'''" # 同理双引号中使用单引号也会被保留下来,但是不能使用双引号 print("str1 {0}".format(str1)) str2="""str2 "str2" 'str2' str2 str2 """ # 使用三引号可以保留下格式来 但是要保证前后对称 print("str2 {0}".format(str2)) str3="""str3 str3 str3 """ # 使用三引号可以保留下格式来 print("str3 {0}".format(str3))
结果:
str0 str0 "str0" """str0""" str1 str1 'str1' '''str1''' str2 str2 "str2" 'str2' str2 str2 str3 str3 str3 str3
4. 转义符和换行符:
# encoding=utf-8 str='I\'m wms' #转义字符和别的语言差不多,都是用 \ print(str) str="下面换行\n真换了" #换行符使用 \n print(str)
结果:
I'm wms 下面换行 真换了
5. 自然字符串和字符串重复:
- 自然字符串字面意思理解就是将字符串保留本身的格式,而不受转义的影响。
- 字符串重复字面意思理解就是将字符串重复输出。
# encoding=utf-8 str=r'I\'m wms' # 自然字符串输出,字符串前加上 r print(str) str="下面换行\n真换了" # 非自然字符串输出就会解释转义字符 print(str) str="重复输出,"*3 #重复输出3次 print(str)
结果:
下面换行
真换了
重复输出,重复输出,重复输出,
6. 子字符串:
- 索引运算符从0开始索引
- 切片运算符[x:y]是指从第x下标开始到第y-1下标
# encoding=utf-8 str='test index' s1=str[0] #获取索引为0的子字符串 print("s1: {0} ".format(s1)) s2=str[8] #如果索引超过字符串长度,则报错 print("s2: {0} ".format(s2)) s3=str[:3] #冒号前的参数不填,表示索引从0开始到冒号后的x-1位 print("s3: {0} ".format(s3)) s4=str[3:6] #索引从冒号前一位到后一位减一的子字符串 print("s4: {0} ".format(s4))
结果:
s1: t
s2: e
s3: tes
s4: t i
7. 数据类型:
- 基本数据类型:基本数据类型就是之前我们讲到的数和字符串,这里就不介绍了。
- 列表:python里没有数组的概念,列表和数组的概念很接近。列表是用来存储一连串元素的容器,用[]表示。
- 元组:同样元组合数组的概念也很接近,用()表示。另外元组只能读取不能修改。
- 集合:
- 格式:set(元素),python的set是一个无序不重复元素集。
- 功能:
- 建立关系
- 消除重复元素
- 字典:Python中的字典也叫关联数组,用{}表示。例: dictionary={'name':'toutou',"age":"26","sex":"male"} ps:是不是觉得有点儿像json?
# encoding=utf-8 #列表 person=["张三","王五","李四"] #大小在声明的时候就确定了 person[2]="lisi" #能改变已有索引处的值 #person[3]="赵六" #该索引超出列表范围,报错 print(person[2]) #元组 names=("张三","王五","李四") #names[2]="lisi" #元组不允许修改 print(names[0]) #集合 x=set('12333的') #此处的字符串并不代表将字符串整个存入,而是将其全部拆分成一个一个的字符,并去除重复项,汉子按照编码拆分 x.add("456") x.add("de") x.add("的") # x.remove('44') #要移除的不存在,则报错 x.remove('de') x.discard("dfd") #要移除的元素存在则移除,不存在也不报错 print x y=set("3456") print "x:{0}".format(x) print "y:{0}".format(y) #交集 print "交集: {0}".format(x&y) # x&y = x.intersection(y) #两个集合中都存在的元素 #并集 print "并集:{0}".format(x|y) # x|y = x.union(y) #将两个集合中的元素合并,去除重复项 #差集 print "差集(x-y):{0}".format(x-y) # x-y = x.difference(y) #以"-"右边的集合为主,去除两个集合交集中的元素 print "差集(y-x):{0}".format(y-x) x.pop() #随机删除一个元素 x.clear() #清空set集合 #字典 dictionary = {"name":"wms",'age':23,'sex':"男"} print dictionary["name"] dictionary["school"]='tianjin' #向字典中添加项目 print dictionary["age"] print dictionary["school"]
结果:
lisi 张三 set(['\x84', '\xe7', '\xe7\x9a\x84', '456', '1', '3', '2', '\x9a']) x:set(['\x84', '\xe7', '\xe7\x9a\x84', '456', '1', '3', '2', '\x9a']) y:set(['3', '5', '4', '6']) 交集: set(['3']) 并集:set(['\x84', '\xe7', '\xe7\x9a\x84', '456', '1', '3', '2', '5', '4', '6', '\x9a']) 差集(x-y):set(['\x84', '\xe7', '\xe7\x9a\x84', '456', '1', '2', '\x9a']) 差集(y-x):set(['5', '4', '6']) wms 23 tianjin
8. 标识符:
在日常生活中,标示符是用来指定某个东西、人,要用到它,他或她的名字;在数学中解方程时,我们也常常用到这样或那样的变量名或函数名;在编程语言中,标识符是用户编程时使用的名字,对于变量、常量、函数、语句块也有名字;我们统统称之为标识符。标识符命名规范:
- 必须只能是字母或下划线开头,不能是数字或者其他字符开头
- 除第一个开头字符外,其他部分可以是字母或者下划线或者数字
- 标识符大小写敏感,比如name和Name是不一样的标识符
特殊标识符:python中的关键字是指系统中自带的具备特定含义的标识符。常用的python关键字主要 有:and,elif,global,or,else,pass,break,continue,import,class,return,for,while... 常用的python关键字很多与其他语言类似的,我们在命名时应尽量避免与关键字重复。大家也不用担心怕不好区分,其实也很好区分,一般的IDE中关键字 是会显示出特定颜色的。
9. 对象:
- Python对象类型:Pyhon的内置对象:数字、字符串、列表、元组、字典、集合等等,在Python中,一切都可以看做是对象。
- Pickle模块:在Python中有时有一些对象需要持久性存储,并且不丢失这个对象的类型与数据,就需要将这些对象进行序列化,序列化之后需要使用时,再恢复为原来的数据。这种序列化的过程,就叫pickle(腌制)。
# encoding=utf-8 # pickle 模块化(腌制) import pickle #dumps(object) 序列化对象 x=["one","two","three"] y=pickle.dumps(x) print "dumps(x) 序列化为:{0}".format(y) #loads(object) 反序列化 z=pickle.loads(y) print "loads(y) 反序列化为:{0}".format(z) # pickle.dump(object,file,True) 将对象序列化写入文件 #此处的文件名字没有特殊要求,文件时存放在项目的根目录下的 wirteFile = file("test01.txt","wb") #这里的"wb","rb"也可以使用"w","r","wb"表示写二进制文件,"w"表示写文本 pickle.dump(x,wirteFile,True) wirteFile.close() #关闭文件流 #pickle.loads(object,file) 将dump存储在文件中的对象反序列化 readFile = file("test.txt","rb") temp = pickle.load(readFile) print "从文件中读取的反序列化对象:{0}".format(temp) readFile.close()
10. 行与缩进:
物理行与逻辑行:
- 物理行:实际中看到的行。python中一个物理行一般可以包含多个逻辑行,在一个物理行中编写多个逻辑行的时候,用分号隔开。一个逻辑行后面必 须有一个分号,注意,在实际程序中,如果一个逻辑行占了一个物理行的最后,这个逻辑行也可以省略分号。(省略规则:每个物理行默认自带一个分号,so,每 个物理行的最后一个逻辑行可以省略分号,故:当一个逻辑行占了一个物理行的时候即可省略分号。)
- 逻辑行:一段代码意义上的行数
- 行连接:行连接相关讲解参见代码讲解图。
- 缩进:在上面, 有朋友提到python语言是"靠缩进控制代码的语言"。的确如此,在python中,逻辑行的起始位置的空白是有语法规定的,如果空白不对,程序就会执 行出错。(这一点是和其他语言很大的一个不同点。)一般情况下(if/while..等等后面的逻辑行除外),单独的逻辑行起始位置不应该有空白。缩进的 方法有两种,可以按空格,也可以按tab键。(一般IDE会自动缩进。)关于缩进可能刚入门起来有点不适应或者不习惯,多试试就好了。
# encoding=utf-8 #物理行与逻辑行 #以下是2个物理行 print "物理行1" #每个物理行结尾默认带上一个分号";" print "物理行2" #以下是1个物理行,2个逻辑行 print "逻辑行1";print "逻辑行2" #此处连着写两个物理行,中间不加分号就报错 #以下是1个逻辑航,2个物理行 print '''你说 我是 物理行还是逻辑行?''' #物理行使用三个引号,换行时不需要使用行连接符"\" #行连接 print "我是行连" \ "接"
结果:
物理行1
物理行2
逻辑行1
逻辑行2
你说
我是
物理行还是逻辑行?
我是行连接