Python语言主要有两个版本。Python2和Python3。在命令行中python
默认是Python2,使用python3
则使用Python3。
- Mac下安装iPython的方法
sudo easy_install pip
sudo pip install ipython #sudo pip3 install ipython
注释
- 使用
#
开头的是单行注释。 - 三个单引号或者三个双引号是多行注释
'''
这是注释
'''
vi xxx.py +lineNumber 直接跳转到lineNumber行进行编辑
编码
py文件中如果有中文,则使用python执行时会报错,python3不会错。解决方法是在第一行加#coding=utf-8
或者 #-*- coding=utf-8 -*-[推荐]
输入
a = input("请输入...")
在python2中,输入的内容是当做代码的。肉疼…
在python3中,输入的内容都当做是字符串
在python中使用raw_input()来实现python3中的input()功能
占位符
name = "bendeng"
print("My name is %s"%name)
print("My name is %s,%s,%s"%(name,name,name))
f = "My name is %s,%s,%s"%(name,name,name)
f = "My name is" + name + name + name
%s
表示字符串,%d
表示数字
变量
使用type(variable)来判断变量的数据类型
字符串转整形: int_var = int(str),其它变量转换类似
变量名由字母、下划线和数字组成,且数字不能开头。
查看系统的关键字
import keyword
keyword.kwlist
运算符
!=或者<>是不等于
or and 相当于其它语言的 || &&
not 相当于 取反符号!
for variable in array:
#TODO
""、0、None、[]、{} 在python中判断时为False
字符串
name = "bendeng"
name[2] ->n
name[-2] ->n 负数表示倒数第几个
- 切片
name[2:5] ->nde取出第一个索引位置到第二个索引-1位置的一片字符串
name[起始位置:终止位置:步长] 步长默认为1
逆序:name[-1::-1]或者name[::-1]
- 操作
- find
name.find("en") ->1
- rfind
name.rfind("en") ->4
- index rindex 类似于find,找不到抛异常
- count
name.count("en") ->2
- replace
name.replace("en","EN") -> bENdENg | name.replace("en","EN",1) ->bEndeng
- split
name.split("en") ->['b', 'd', 'g']
- str.split() 默认以多种空白字符串切割
- endswith
name.endswith("ng") -> True
- startwith
name.startswith("be") -> True
- lower
name.lower()
- upper
name.upper() ->BENDENG
- rjust
name.rjust(10) ->' bendeng'
- center
name.center(10) -> ' bendeng '
- ljust
name.ljust(10) -> 'bendeng '
- lstrip 去左空格
- rstrip 去右空格
- strip 去左右空格
- partition
name.partition("en") -> ('b', 'en', 'deng')
- rpartition
- splitlines
name = "ben\ndeng" name.splitlines() ->['ben', 'deng']
- isalpha 是否是纯字母
- isdigit 是否是纯数字
- isalnum 是否是字母数字
- isspace 是否是纯空格
- join
str1.join(arr1) 使用str1连接arr1
- find
列表
Python中的列表类似于其它语言的数组,不同的是Python中的列表元素可以是不同的数据类型。
names = ["bendeng","ada","ouyang"]
#添加数据
names.append("David")
names.insert(0,"First") //在某个索引位置添加
names2 = ["names1","names2"]
names3 = names + names2 //两个列表直接相加
names3 = names.extend(names2)
append直接添加,extends是扩展,两者是有区别的。
#删除数据
names.pop() //弹出最后一个
nams.remove(element) //根据element只删除第一个
del names[index] // 删除某个索引
#修改数据
names[index] = newValue
#查找
element in names //使用in查找列表中是否存在某元素
字典
{key:value}
info = {'name':'bendeng','age':20}
info['qq'] = '123456' #添加或修改
del info['qq'] #删除
info['qq'] 或 info.get('qq') #查询。后者不会崩溃
info.keys() #返回key的列表
info.values() #返回values的列表
info.items() #返回key-value(元组)的列表
元组
元组和列表用法极其类似。但不同的是使用()表示,而且定义后不可修改,只可查询和遍历。
name = ('ben','deng')
a,b = name
- 元组只有一个元素,使用(a,) 表示
- 两个变量交换值,可以使用
a,b = b,a
函数
def function_name():
code...
在函数中使用global关键字修饰的变量会变成全局变量。
- 缺省参数和命名参数
只能放在参数列表的最后定义,可以多个。
def function_name(a,b=defaultValue,c=defaultValue):
code...
//调用
function_name(A,B) #传给a,b两个形参
function_name(A,c=valueC) #传给a,c两个形参。c=valueC叫命令参数。命名参数只能取形参的参数名
- 不定长参数
*args一般定义成args,也可以是其它变量,必须放在形参最后
def function_name(a,b,*args):#*args表示将满足形参个数多的参数给它,属于元组类型
code...
def function_name(a,b,*args,**kwargs):#**kwargs是字典类型的不定长参数
code...
拆包
def function_name(a,b,*args,**kwargs):
code...
C = (c,)
D = {'d':dv}
当调用function_name(A,B,C,D)
时,kwargs不会接受参数。这时需要拆包,调用方式如下:function_name(A,B,*C,**D)
* 表示拆元组,**拆字典,相当于调用function_name(A,B,c,'d':dv)
引用
id(var)
获取变量的地址
a = 1
b = a
在python中,a,b都指向同一个内存地址,即变量100的地址。
可变与不可变
- python中,只有列表和字典可变,其他的数据类型不可变。
- python中的字典数据中只有不可变类型才可以当做key。
- python中的可变数据类型传参,会对可变数据类型变量进行修改
匿名函数
使用lambda
关键字进行匿名函数的定义。像Java8和Swift语言中的闭包。
def function_name(a,b,func):
code...
function_name(A,B,lambda x,y:x+y)
可以通过eval(Str)
将字符串转换成函数,比如eval("lambda x,y:x+y")
文件
r 只读模式。文件必须存在。
w 写模式,原来有内容则删除。文件不存在则创建。
a 追加模式。
rb 二进制模式只读。这是文件打开的默认模式。
wb 二进制打开只用于写入。
ab 二进制追加。
r+ 打开一个文件用于读写。文件指针件事放在文件开头
w+ 打开一个文件用于读写。文件不存在则创建。
a+ 打开一个文件用于读写。文件不存在则创建。追加模式
rb+
wb+
ab+
- 打开文件
f = open("1234.txt","w")
- 关闭文件
f.close()
- 读取文件
f.read() #读取文件所有的内容
f.read(1) #读取1个字节,指针往下移
- 写入文件
f.write("") #写入内容。返回写入文件的长度
- 其他方法
readline()
#读取一行readlines()
#返回一个列表,每一行是元素seek(offsetBytes,0)
#文件定位。offsetBytes负数往左调,正数右调。python3不支持负数tell()
#返回文件当前的位置
- 重命名及删除
import os
os.rename(newFileName,oldFileName)
os.remove(fileName)
- 文件夹操作
import os
os.mkdir(dirName) #创建目录
os.rmdir(dirName) #删除目录
os.chdir(dirName) #改变默认目录
os.getcwd() #当前目录
os.listdir('dirName') #获取某目录下的所有文件
面向对象
操作属性和方法的方式类似于JavaScript。
self和其它语言的this关键字类似
- 定义类
class 类名:
属性列表
property = value #在class体中定义的属性是类属性
__variable #以__开头的变量是私有属性,不会被子类继承
方法列表
def __new__(cls):
// TODO
return object.__new__(cls) #最后一定要调用父类的这个方法
def __init__(self):
//TODO self一般这么写,可以写其它
def __str__(self):
//TODO 类似于Java的toString方法
def __del__(self):
//TODO python自动调用
def __privateMethod():
// #以__开头的是私有方法,不会被继承,也不能在子类中使用
#类方法
@classmethod
def methodName(cls): #cls一般是这么写,可以写成其它;
// TODO
#静态方法
@staticmethod
def methodName():
// TODO
在python中先调用的new方法创建对象,init负责初始化。这两者合起来类似父类的构造方法
- 创建对象
var = ClassName()
测量对象的引用计数:
import sys
sys.getrefcount(object)
- 继承
class ClassName(ParentClassName):
方法列表
#调用父类的方法,类似于Java中的super.methodName();两种方法:
1、ParentClassName.methodName(self)
2、super().methodName()
- 多继承
class ClassName(Parent1,Parent2,...):
// TODO
print(ClassName.__mro__)
#返回元组,方法调用的遍历顺序
- 单例模式
class ClassName(object):
__instance = None
def __new__(cls):
if __instance == None:
__instance = object.__new__(cls)
return __instance
else:
return __instance
异常处理
try:
// TODO
#raise引发一个自定义的异常,类似于Java的throws
raise CustomeException("my customer exception")
except CustomeException:
// TODO
except (ExceptionName1,ExceptionName2):
// TODO
except Exception as expt:#上面未捕获到的异常一定在这里捕获,放到expt对象中可进行处理
// TODO
else: #没有异常执行此处
// TODO
finally: #一定会执行到这里
// TODO
自定义异常类
class CustomeException(Exception): #Exception异常的基类
def __init__(self,message):
//TODO
模块
- 安装模块
sudo pip install ModuleName
sudo pip3 install ModuleName #python3的安装方式
- 使用模块
import ModuleName
import ModuleName as AliasModuleName
from ModuleName import functionName
from ModuleName import functionName1,functionName2
from ModuleName import * #谨慎使用,后面不同模块的函数名和前面的同名,只会导入后面的函数名。
先搜索当前路径下的模块,找不到再去找系统路径下的模块。
moduleName.__file__ #返回模块的路径
if __name__ == "__main__"
// TODO 如果直接运行,为True。作为模块给别人调用,为False
模块中的__all__
定义的是模块被引用的内容,from ModuleName import *
只能使用在__all__
中定义的属性、方法和类
__all__ = ["functionName","propertyName","className"]
包
将几个相关py(模块)文件放在同一个文件夹,在文件夹下创建__init__.py
文件,那么python将此文件夹视为包
。
1、python2必须在文件夹内添加
__init__.py
才能将文件夹当做包,python3则不必须
2、在__init__.py
中定义__all__
变量,决定包里能from的模块
3、[Python2]在__init__.py
中import moduleName,决定包里能import的模块
4、兼容Python3:使用from . import moduleName
模块发布
1、在当前目录新建一个setup.py
文件。在文件里写入
from distutils.core import setup
setup(name="bendeng", version="1.0", description="bendeng's module", author="bendeng", py_modules=['packageName.moduleName1', 'packageName.moduleName2'])
2、构建模块
python(python3) setup.py build
python(python3) setup.py sdist
3、发布后安装
先将.tar.gz解压,cd到目录里
sudo python(python3) setup.py install
给程序传参
方式:
python xxxx.py params
实现
import sys
sys.argv #接收params参数
列表推导式
range(num,[num2],[step]) #生成一个列表。用法类似切片
range的风险:python2中使用很大的数字,会申请很大的内存。python3中,没有此风险,按需申请内存。
a = [i for i in range(num1,[num2],[step])] #列表生成式
如:
a = [i for i in range(10)]
a = [10 for i in range(10)]
a = [i for i in range(10) if i % 2 == 0]
a = [(i,j) for i in range(10) for j in range(10)]
集合
a = (1,2,3) #元组
b = [1,2,3] #列表
c = {1,2,3} #集合。不能有重复元素,可以用于去重;支持增删改查。
c = set(b) #列表转集合
b = list(c) #集合转列表