Python语法总结 |
您所在的位置:网站首页 › python中的fun › Python语法总结 |
前言 脚本是一种很有用的东西,它可以帮助我们减少很多重复的劳动。脚本的选择也有很多:JavaScript(Node.js)、Python、PHP、Shell ... 今天花了几个小时浏览了一下Python语法,做了一些小笔记,以便日后快速浏览复习: Python格式编码Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。 解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了。 #coding=utf-8 print "你好,世界";注释单行注释采用 # 开头: name = "Madisetti" # 这是一个注释多行注释使用三个单引号(''')或三个双引号("""): ''' 这是多行注释,使用单引号。 这是多行注释,使用单引号。 这是多行注释,使用单引号。 ''' """ 这是多行注释,使用双引号。 这是多行注释,使用双引号。 这是多行注释,使用双引号。 """行和缩进Python 的代码块不使用大括号 {} 来控制类、函数以及其他逻辑判断,而是是用缩进来写模块;缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行,否则会报“IndentationError: unexpected indent”错误 Python的语句后可以加分号(;),也可以省略分号,主要通过换行来识别语句的结束。 多行语句:Python语句中一般以新行作为为语句的结束符。但是我们可以使用斜杠( \)将一行的语句分为多行显示 total = item_one + \ item_two + \ item_three三引号可以由多行组成:''' 或 """ paragraph = """这是一个段落。 包含了多个语句"""语句中包含 [], {} 或 () 括号就不需要使用多行连接符: days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']单行多条语句:Python 可以同一行显示多条语句,方法是用分号 ; 分开,如: >>> print 'hello';print 'runoob'; hello基本输入输出print 默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号: # 换行输出 print x print y # 不换行输出 print x, print y,变量类型Python 标识符标识符:可以包括英文、数字以及下划线(_),但不能以数字开头;区分大小写。以下划线开头的标识符是有特殊意义的:以单下划线开头: _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入;以双下划线开头: __foo 代表类的私有成员;以双下划线开头和结尾: __foo__ 代表 Python 里特殊方法专用的标识,如 __init__() 代表类的构造函数。Python 保留字符Python 的关键字只包含小写字母 " " 或 ' ' python的字串列表有2种取值顺序:从左到右索引默认0开始的,最大范围是字符串长度少1从右到左索引默认-1开始的,最大范围是字符串开头截取子字符串: [头下标:尾下标],如:s = 'ilovepython' , s[1:5]的结果是love加号(+)是字符串连接运算符,星号(*)是重复操作#!/usr/bin/python # -*- coding: UTF-8 -*- str = 'Hello World!' print str # 输出完整字符串 print str[0] # 输出字符串中的第一个字符 print str[2:5] # 输出字符串中第三个至第五个之间的字符串 print str[2:] # 输出从第三个字符开始的字符串 print str * 2 # 输出字符串两次 print str + "TEST" # 输出连接的字符串转义字符:字符串运算符: 格式化字符串的输出: print "My name is %s and weight is %d kg!" % ('Zara', 21)以上实例输出结果: My name is Zara and weight is 21 kg!python字符串格式化符号: 使用[ ]。 #!/usr/bin/python # -*- coding: UTF-8 -*- list = [ 'runoob', 786 , 2.23, 'john', 70.2 ] tinylist = [123, 'john'] print list # 输出完整列表 print list[0] # 输出列表的第一个元素 print list[1:3] # 输出第二个至第三个的元素 print list[2:] # 输出从第三个开始至列表末尾的所有元素 print tinylist * 2 # 输出列表两次 print list + tinylist # 打印组合的列表以上实例输出结果: ['runoob', 786, 2.23, 'john', 70.2] runoob [786, 2.23] [2.23, 'john', 70.2] [123, 'john', 123, 'john'] ['runoob', 786, 2.23, 'john', 70.2, 123, 'john']修改列表元素: list[2] = 1000 # 直接覆盖原值可以使用 del 语句来删除列表的的元素: list1 = ['physics', 'chemistry', 1997, 2000]; del list1[2];列表脚本操作符: 使用()。 元组类似于List(列表),但是元组不能二次赋值,相当于只读列表。 #!/usr/bin/python # -*- coding: UTF-8 -*- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 ) list = [ 'runoob', 786 , 2.23, 'john', 70.2 ] tuple[2] = 1000 # 元组中是非法应用 list[2] = 1000 # 列表中是合法应用#!/usr/bin/python # -*- coding: UTF-8 -*- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 ) tinytuple = (123, 'john') print tuple # 输出完整元组 print tuple[0] # 输出元组的第一个元素 print tuple[1:3] # 输出第二个至第三个的元素 print tuple[2:] # 输出从第三个开始至列表末尾的所有元素 print tinytuple * 2 # 输出元组两次 print tuple + tinytuple # 打印组合的元组以上实例输出结果: ('runoob', 786, 2.23, 'john', 70.2) runoob (786, 2.23) (2.23, 'john', 70.2) (123, 'john', 123, 'john') ('runoob', 786, 2.23, 'john', 70.2, 123, 'john')元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组: tup = ('physics', 'chemistry', 1997, 2000); del tup;元组操作: 使用{ }。 字典由索引 key 和它对应的值 value 组成。 键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行。 #!/usr/bin/python # -*- coding: UTF-8 -*- dict = {} dict['one'] = "This is one" dict[2] = "This is two" tinydict = {'name': 'john','code':6734, 'dept': 'sales'} print dict['one'] # 输出键为'one' 的值 print dict[2] # 输出键为 2 的值 print tinydict # 输出完整的字典 print tinydict.keys() # 输出所有键 print tinydict.values() # 输出所有值输出结果为: This is one This is two {'dept': 'sales', 'code': 6734, 'name': 'john'} ['dept', 'code', 'name'] ['sales', 6734, 'john']修改字典元素: dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; dict['Age'] = 8; # update existing entry dict['School'] = "DPS School"; # Add new entry删除字典元素: dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; del dict['Name']; # 删除键是'Name'的条目 dict.clear(); # 清空词典所有条目 del dict ; # 删除词典运算符逻辑运算符: 假设变量 a 为 10, b为 20: 成员运算符: 身份运算符: 算术运算符: 比较运算符: 赋值运算符: 位运算符: for: # 遍历 fruits = ['banana', 'apple', 'mango'] for fruit in fruits: print '当前水果 :', fruit # 下标迭代 fruits = ['banana', 'apple', 'mango'] for index in range(len(fruits)): print '当前水果 :', fruits[index] # for 循环嵌套 for iterating_var in sequence: for iterating_var in sequence: statements(s) statements(s)while: while 判断条件: 执行语句…… # while 循环嵌套 while expression: while expression: statement(s) statement(s)break:就像在C语言中,打破了最小封闭for或while循环 continue :跳出本次循环 pass:空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。 函数定义函数def functionname( parameters ): "函数_文档字符串" function_suite return [expression]实例: def printme( str ): "打印传入的字符串到标准显示设备上" print str return函数调用#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def printme( str ): "打印任何传入的字符串" print str; return; # 调用函数 printme("我要调用用户自定义函数!"); printme("再次调用同一函数");匿名函数python 使用 lambda 来创建匿名函数,lambda函数的语法只包含一个语句: lambda [arg1 [,arg2,.....argn]]:expression例子: # 可写函数说明 sum = lambda arg1, arg2: arg1 + arg2; # 调用sum函数 print "相加后的值为 : ", sum( 10, 20 )参数必备参数: 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。 #可写函数说明 def printme( str ): "打印任何传入的字符串" print str; return; #调用printme函数 printme("s");关键字参数: 函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值 #可写函数说明 def printinfo( name, age ): "打印任何传入的字符串" print "Name: ", name; print "Age ", age; return; #调用printinfo函数 printinfo( age=50, name="miki" );缺省参数: 调用函数时,缺省参数的值如果没有传入,则被认为是默认值 #可写函数说明 def printinfo( name, age = 35 ): "打印任何传入的字符串" print "Name: ", name; print "Age ", age; return; #调用printinfo函数 printinfo( age=50, name="miki" ); printinfo( name="miki" );不定长参数: 一个函数能处理比当初声明时更多的参数。声明时不会命名。基本语法如下: def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]例子: # 可写函数说明 def printinfo( arg1, *vartuple ): "打印任何传入的参数" print "输出: " print arg1 for var in vartuple: print var return; # 调用printinfo 函数 printinfo( 10 ); printinfo( 70, 60, 50 );参数传递: 在 python 中,strings, tuples, 和 numbers 是不可更改(immutable)的对象,而 list,dict 等则是可以修改(mutable)的对象。 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。python 函数的参数传递: 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。 return 语句返回单值: # 可写函数说明 def sum( arg1, arg2 ): # 返回2个参数的和." total = arg1 + arg2 return total; # 调用sum函数 total = sum( 10, 20 );返回多值: Python的函数返回多值其实就是返回一个tuple: import math def move(x, y, step, angle): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny #效果与return (nx,ny)相同 print(move(100, 100, 60, math.pi / 6))输出: (151.96152422706632, 70.0)变量作用域如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。 Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。因此,如果要给函数内的全局变量赋值,必须使用 global 语句。例如: Money = 2000 def AddMoney(): # 想改正代码就取消以下注释: # global Money Money = Money + 1模块module:一个 .py 文件就是个 module 模块能定义函数,类和变量,模块里也能包含可执行的代码。 重复执行模块当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下: reload(module_name)在这里,module_name要直接放模块的名字,而不是一个字符串形式。比如想重载 hello 模块,如下: reload(hello)模块的引入import当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。 当你导入一个模块,Python 解析器对模块位置的搜索顺序是: 1、当前目录 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。 模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。 在 Windows 系统,典型的 PYTHONPATH 如下:set PYTHONPATH=c:\python27\lib; 在 UNIX 系统,典型的 PYTHONPATH 如下:set PYTHONPATH=/usr/local/lib/python import module1[, module2[,... moduleN]在调用模块中的函数时,必须这样引用: 模块名.函数名例子: #!/usr/bin/python # -*- coding: UTF-8 -*- # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("Runoob")From…importPython 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中 from modname import name1[, name2[, ... nameN]]例如,要导入模块 fib 的 fibonacci 函数,使用如下语句: from fib import fibonacci把一个模块的所有内容全都导入到当前的命名空间: from modname import *包简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。 包中有很多模块(.py文件),可以直接通过 "包名.模块名"引用模块。 更多阅读: Python包和类的基本用法:http://blog.csdn.net/liukang325/article/details/46724365 python中if __name__ == '__main__': 的解析: http://www.cnblogs.com/xuxm2007/archive/2010/08/04/1792463.html 类类定义class ClassName: '类的帮助信息' #类文档字符串 class_suite #类体例子: #!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary创建实例对象"创建 Employee 类的第一个对象" emp1 = Employee("Zara", 2000) "创建 Employee 类的第二个对象" emp2 = Employee("Manni", 5000)访问属性emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount可以添加,删除,修改类的属性: emp1.age = 7 # 添加一个 'age' 属性 emp1.age = 8 # 修改 'age' 属性 del emp1.age # 删除 'age' 属性可以使用以下函数的方式来访问属性: getattr(obj, name[, default]) : 访问对象的属性。hasattr(obj,name) : 检查是否存在一个属性。setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。delattr(obj, name) : 删除属性。hasattr(emp1, 'age') # 如果存在 'age' 属性返回 True。 getattr(emp1, 'age') # 返回 'age' 属性的值 setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8 delattr(empl, 'age') # 删除属性 'age'类属性与方法: 类的私有属性:__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。类的方法:在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数 类的私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods单下划线、双下划线、头尾双下划线说明: __foo__: 定义的是特列方法,类似 __init__() 之类的。_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import * __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。Python内置类属性: __dict__ : 类的属性(包含一个字典,由类的数据属性组成)__doc__ :类的文档字符串__name__: 类名__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary print "Employee.__doc__:", Employee.__doc__ print "Employee.__name__:", Employee.__name__ print "Employee.__module__:", Employee.__module__ print "Employee.__bases__:", Employee.__bases__ print "Employee.__dict__:", Employee.__dict__执行以上代码输出结果如下: Employee.__doc__: 所有员工的基类 Employee.__name__: Employee Employee.__module__: __main__ Employee.__bases__: () Employee.__dict__: {'__module__': '__main__', 'displayCount': , 'empCount': 0, 'displayEmployee': , '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': }类的继承在python中继承中的一些特点: 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。 2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。 class SubClassName (ParentClass1[, ParentClass2, ...]): 'Optional class documentation string' class_suite类判断: issubclass() - 布尔函数:判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)isinstance(obj, Class) 布尔函数:如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。类重写: #!/usr/bin/python # -*- coding: UTF-8 -*- class Parent: # 定义父类 def myMethod(self): print '调用父类方法' class Child(Parent): # 定义子类 def myMethod(self): print '调用子类方法' c = Child() # 子类实例 c.myMethod() # 子类调用重写方法基础重载方法: Python 使用了引用计数这一简单技术来跟踪和回收垃圾:在 Python 内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量,称为一个引用计数器。当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。 垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。 a = 40 # 创建对象 b = a # 增加引用, 的计数 c = [b] # 增加引用. 的计数 del a # 减少引用 的计数 b = 100 # 减少引用 的计数 c[0] = -1 # 减少引用 的计数异常python标准异常BaseException、SystemExit、StandardError等 自定义异常class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg在你定义以上类后,你可以触发该异常,如下所示: try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args异常处理try: #运行别的代码 except : #如果在try部份引发了'name'异常 except ,: #如果引发了'name'异常,获得附加的数据 else: #如果没有异常发生try: 正常的操作 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 ...................... else: 如果没有异常执行这块代码 try: finally: #退出try时总会执行例子: #!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()应用python函数库:(需要什么功能就google一下即可) 操作字符串、列表、元组、字典等时间文件I/O异步I/OFile 方法OS 文件/目录方法内置函数面向对象正则表达式MySQL网络编程(TCP/IP、HTTP...)SMTP多线程多进程XML解析JSONweb框架爬虫框架。。。参考来源:Python 基础教程 | 菜鸟教程 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |