一、python特点总结
1、python是一门多用途的编程语言,时常扮演脚本语言的角色。可定义为面向对象的脚本语言。
2、python的缺点:相对于C++ 执行速度不够快。
3、python解释器:python代码与计算器硬件之间的软件逻辑层。python解释器是运行python程序的程序。
python的执行模式,源代码转换为字节码,字节码在python虚拟机中运行。
字节码是python将程序编译后所得到的底层形式,字节码文件后缀名 .pyc。
4、模块导入和命名空间:模块导入是一种运行代码文件的方法,一般python程序往往由多个模块文件构成,通过import语句链接到一起,每个模块文件是一个独立完整的变量包,即一个命名空间。
5、使用命名行运行 .py文件
python script.py
linux系统下,path目录下没有设置python环境变量,则需要到 /usr/local/bin/python 目录下。
6、代码块
使用冒号(:)指出接下来是一个代码块,并且该代码块中的每行代码都缩进相同的程度。
二、python数据类型
Python有五个标准的数据类型:
- Numbers(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Dictionary(字典)
2.1 数字
数字数据类型用于存储数值。他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。当你指定一个值时,Number 对象就会被创建:
Python支持四种不同的数字类型:
- int(有符号整型)
- long(长整型,也可以代表八进制和十六进制)
- float(浮点型)
- complex(复数)
2.2 字符串
字符串或串(String)是由数字、字母、下划线组成的一串字符。
字符串是 Python 中最常用的数据类型。我们可以使用引号 ( ' 或 " ) 来创建字符串。
>>> s = 'abcdef'
>>> s[1:5]
'bcde'
str = 'Hello World!'
print str # 输出完整字符串
print str[0] # 输出字符串中的第一个字符
print str[2:5] # 输出字符串中第三个至第六个之间的字符串
print str[2:] # 输出从第三个字符开始的字符串
print str * 2 # 输出字符串两次
print str + "TEST" # 输出连接的字符串
2.3 列表
List(列表) 是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。
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']
2.4 元组
元组是另一个数据类型,类似于 List(列表)。元组用 () 标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。
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')
2.5 字典
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。
两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。字典用"{ }"标识。字典由索引(key)和它对应的值value组成。
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'runoob','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': 'runoob'} ['dept', 'code', 'name'] ['sales', 6734, 'runoob']
2.6 数据类型转换
函数 | 描述 |
---|---|
将x转换为一个整数 | |
将x转换为一个长整数 | |
将x转换到一个浮点数 | |
创建一个复数 | |
将对象 x 转换为字符串 | |
将对象 x 转换为表达式字符串 | |
用来计算在字符串中的有效Python表达式,并返回一个对象 | |
将序列 s 转换为一个元组 | |
将序列 s 转换为一个列表 | |
转换为可变集合 | |
创建一个字典。d 必须是一个序列 (key,value)元组。 | |
转换为不可变集合 | |
将一个整数转换为一个字符 | |
将一个整数转换为Unicode字符 | |
将一个字符转换为它的整数值 | |
将一个整数转换为一个十六进制字符串 | |
将一个整数转换为一个八进制字符串 |
2.7 python赋值
(1)序列解包
x, y, z = 1, 2, 3
x , y = y, x
(2)链式赋值
x = y = 1
(3)增强赋值
x = 2
x += 1
x *= 2
三、python print用法总结
3.1 使用{}
j = 1
i = 2
print('{0}+{1}={2}'.format(j, i, j + i));
输出结果:
1+2=3
3.2 使用%
输出结果:
j = 1
i = 2
print("%d + %d = %d" % (j, i, j + i));
四、python函数
4.1 python函数定义方式
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def functionname( parameters ):
"函数_文档字符串"
function_suite
return [expression]
def 函数名(参数列表):
//实现特定功能的多行代码
[return [返回值]]
函数的值传递和引用传递:
4. 2 定义不定长参数函数
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
加了星号(*)的变量名会存放所有未命名的变量参数。不定长参数实例如下:
应用举例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple:
print var
return
# 调用printinfo 函数
printinfo( 10 )
printinfo( 70, 60, 50 )
输出: 10 输出: 70 60 50
4.3 lambda表达式创建匿名函数
lambda [arg1 [,arg2,.....argn]]:expression
举例:
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print "相加后的值为 : ", sum( 10, 20 )
print "相加后的值为 : ", sum( 20, 20 )
4.4 python 传值和传引用
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于传址。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用(其实也是对象地址!!!),就不能直接修改原始对象——相当于传值。
所以python的传值和传址是根据传入参数的类型来选择的
传值的参数类型:数字,字符串,元组(immutable)
传址的参数类型:列表,字典(mutable)
五、类
5.1 类的创建于实例化使用方法
# coding: utf-8
# 创建一个类,类名称第一个字母大写,可以带括号也可以不带括号
class Student():
student_count = 0
def __init__(self, name, salary):
self.name = name
self.age = salary
Student.student_count += 1
def display_count(self):
print('Total student {}'.format(Student.student_count))
def display_student(self):
print('Name: {}, age: {}'.format(self.name,self.age))
def get_class(self):
if self.age >= 7 and self.age < 8:
return 1
if self.age >= 8 and self.age < 9:
return 2
if self.age >= 9 and self.age < 10:
return 3
if self.age >= 10 and self.age < 11:
return 4
else:
return 0
实例化方法:
student1 = Student('cuiyongyuan',10)
student2 = Student('yuanli', 10)
student1.display_student()
student2.display_student()
student1_class = student1.get_class()
student2_class = student2.get_class()
实例化过程:
class luffy_stu:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
pass
if __name__=="__main__":
stu1 = luffy_stu('bao',21,'male')
#1. 是先产生一个stu1对象,
#2. luffy_stu.__init__('stu1','bao',21,'male')再将stu1对象传入__init__构造函数中实例化对象
5.2 装饰器@staticmethod和@classmethod
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
使用@staticmethod或@classmethod,可以不需要实例化,直接类名.方法名()来调用。
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
class Test(object):
"""docstring for Test"""
def __init__(self, arg=None):
super(Test, self).__init__()
self.arg = arg
def say_hi(self):
print 'hello wrold'
@staticmethod
def say_bad():
print 'say bad'
@classmethod
def say_good(cls):
print 'say good'
def main():
test = Test()
test.say_hi()
Test.say_bad() //直接类名.方法名()来调用
Test.say_good() //直接类名.方法名()来调用
if __name__ == '__main__':
main()
六、模块加载
模组,一般称为类库或模块。
模块分为标准模块、第三方模块、自定义模块。
6.1 调用模块
#调用time模块
import time
#直接导入time模块中的ctime()函数
from time import ctime
#导入time模块的所有函数
from time import *
#导入time模块的多个函数
from time import time,sleep
#用as对导入的函数进行重命名
from time imort ctime as sys_time
6.2 引用自定义模块
6.2.1 被引用模块与引用模块在同一级目录
如:
project1/
------- calculator.py
------- test.py
calculator.py 有函数 add()
def add(a , b);
return a + b
同一级目录下的 test.py 导入calculator.py 中的 add() 函数;
from calculator import add
print (add(a , 5))
6.2.2 被引用模块与引用模块不在同一级目录
如:
project1/
-------module/
------- calculator.py
-------test/
------- test.py
calculator.py 有函数 add()
def add(a , b);
return a + b
test.py 需要加载不同目录下模块
import sys
from os.path import dirname, abspath
#_file_ 用于获取文件所在路径,dirname用于获取上级目录
project_path = dirname(dirname(abspath(_file_)))
sys.path.append(project_path+"\\module")
from calculator import add
print(add(2,3))
七、异常处理
7.1 BaseException 捕获所有异常
try:
open("abcd.txt", 'r')
print a
except BaseException as mes:
print(msg)
7.2 其他异常用法
7.2.1 try except else用法
没有异常则执行else语句
try:
open("abcd.txt", 'r')
print a
except BaseException as mes:
print(msg)
else:
print("没有异常时执行")
7.2.2 try except finally用法
不管有没有异常,都会执行 finally语句
try:
open("abcd.txt", 'r')
print a
except BaseException as mes:
print(msg)
finally:
print("不管是否出现异常,都会被执行")
7.2.3 抛出异常
#定义say_hello()函数
def say_hello(name = None):
if name is None:
raise NameError('"name" cannot be empty')
else:
print("hello, %s" %name)
#调用say_hello()函数
say_hello()
raise关键字可以用来抛出一个异常信息,raise只能使用Python提供的异常类,如果想要raise使用自定义异常类,则自定义异常类需要继承Exception类。
参考文献:
【1】python学习手册(第四版)