目录
基础特性
●首部添加#!/usr/bin/env python3表示这是一个python3程序
●变量为动态类型,弱类型语言的主要特性之一,要声明变量直接变量名=xx即可,如x=777
●语句之后没有分号; 作为结束,取而代之的是每行首部的缩进进行标识
●运算符号中**代表^即指数,#为//,即注释,""" ... """为文档字符串,即/** ... */
●默认数值类型为浮点型
●基本类型函数; int(变量),float(变量),str(变量)等 将变量直接变为指定类型
●不使用{}区分代码块,而是用冒号:
●&& || ! 分别变为 and or not
●库用import导入, 如import math
●允许交换依次赋值,例:a,b=b,a+b按照顺序语句理解即可
●if __name__ == '__main__':表示程序执行的入口(如c中的main)Python本身并没有这么规定,这只是一种编码习惯。由于模块之间相互引用,不同模块可能有这样的定义,而程序入口只有一个。到底哪个程序入口被选中,这取决于__name__
的值。_name__
是内置变量,可用于表示当前模块的名字
●input("提示消息,可加可不加") --从终端接收数据
●print() 输出数据
print("...{}".format(变量),end="x") 格式化输出数据, 如:print('{:.10f} {}'.format(x,y)),以保留10个小数点的格式输出x,直接输出y
end=“x”代表每个元素以x结尾,详情自查
●字符串若是乘上整数 n,将返回由 n 个此字符串拼接起来的新字符串,例: 's' * 10 等于'ssssssssss'
数据结构/常用函数
列表list,可用作栈/队列
声明,如:a=[1,2,3]
主要函数:
- append(x):将x添加到尾部
- insert(index,x):将x插入到索引index处
- count(x):返回x出现的次数
- remove(x):移除x
- pop(index):将索引index处的元素弹出
- reverse():翻转列表
- extend(b):将列表b添加到列表结尾
- sort():排序
- 可使用del关键字删除指定位置的列表元素。如del a[0]
列表推导式:一种列表推导的简写方式,列表推导式由包含一个表达式的中括号组成,表达式后面跟随一个 for 子句,之后可以有零或多个 for 或 if 子句。结果是一个列表,由表达式依据其后面的 for 和 if 子句上下文计算而来的结果构成,如:squares = [x**2 for x in range(10)]
切片:返回列表某个范围内的列表,即访问某段内的元素,如a[:3]
翻转:a[::-1]
元组tuple
元素不可变的列表
声明,如 a=(1,2,3)或者,a=1,2,3
这样声明就是元组,编辑元组元素会报错
集合set
集合是一个无序不重复元素的集。
声明,如a={1,2,3},或者a=set()(即创建一个集合),可以传参数,该参数为初始列表,如a = set('ab')为{a,b}
如果想要创建空集合,必须使用 set() 而不是 {}。后者用于创建空字典。
交并差& | - a^b:存在于a或b但不能同时存在
字典dictionary
字典是是无序的键值对(key:value
)集合。
声明,如a={1:2,2:3}
items():用于迭代字典,返回为(x,y),类型为class dict_items
字符串string
声明 s=""
如果你想要分几行输入字符串,并且希望行尾的换行符自动包含到字符串当中,可以使用三对引号:"""\...""" 或 '''\...''' 。
string有各种内置方法
title()
返回字符串的标题版本,即单词首字母大写其余字母小写upper()
返回字符串全部大写的版本upper()
返回字符串全部大写的版本swapcase()
返回字符串大小写交换后的版本isalnum()
检查所有字符是否只有字母和数字isalpha()
检查字符串之中是否只有字母split()
分割任意字符串,split()
允许有一个参数,用来指定字符串以什么字符分隔(默认为" "
),它返回一个包含所有分割后的字符串的列表。join(list)
使用指定字符连接多个字符串,将列表list中的元素用该字符串连接起来strip(chars)
,用来剥离字符串首尾中指定的字符,默认为" ",剥离规则为按chars中的char顺序寻找该字符串,找到删除,若不指定参数,则效果为剥离首尾空格与换行符lstrip(chars))
只对字符串左剥离-
rstrip(chars)
只对字符串右剥离。 find()
找到第一个匹配的子字符串,没有找到则返回 -1
通用函数:
type(a):返回a的类型
len(a): 返回 a的长度
range(a,b,c):生成一个等差数列,非列表,a,b为范围,c为差值
函数
定义函数:
def 函数名(参数):
语句1
语句2
global关键字定义全局变量,即使在函数内部也可以定义
函数的参数变量可以有默认值:def test(a , b=-99):
可以接收一个函数作为参数,在函数内部使用参数函数,即高级函数
map(function,list):
map 是一个在 Python 里非常有用的高阶函数。它接受一个函数和一个序列(迭代器)作为输入,然后对序列(迭代器)的每一个值。返回一个序列(迭代器),其包含应用函数后的结果。
举例:
>>> lst = [1, 2, 3, 4, 5]
>>> def square(num):
... return num * num
>>> print(list(map(square, lst)))
[1, 4, 9, 16, 25]
可变参数 * args
/关键字参数 ** kwargs(
来源于:https://zhuanlan.zhihu.com/p/50804195)
在Python中的代码中经常会见到这两个词 args 和 kwargs,前面通常还会加上一个或者两个星号。其实这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字参数。这其实就是 Python 中可变参数的两种形式,并且 *args 必须放在 **kwargs 的前面,因为位置参数在关键字参数的前面。
*args
*args就是就是传递一个可变参数列表给函数实参,这个参数列表的数目未知,甚至长度可以为0。
def test_args(first, *args):
print('Required argument: ', first)
print(type(args))
for v in args:
print ('Optional argument: ', v)
test_args(1, 2, 3, 4)
第一个参数是必须要传入的参数,所以使用了第一个形参,而后面三个参数则作为可变参数列表传入了实参,并且是作为元组tuple来使用的。代码的运行结果如下
Required argument: 1
<class 'tuple'>
Optional argument: 2
Optional argument: 3
Optional argument: 4
**kwargs
而**kwargs则是将一个可变的关键字参数的字典传给函数实参,同样参数列表长度可以为0或为其他值。下面这段代码演示了如何使用kwargs
def test_kwargs(first, *args, **kwargs):
print('Required argument: ', first)
print(type(kwargs))
for v in args:
print ('Optional argument (args): ', v)
for k, v in kwargs.items():
print ('Optional argument %s (kwargs): %s' % (k, v))
test_kwargs(1, 2, 3, 4, k1=5, k2=6)
正如前面所说的,args类型是一个tuple,而kwargs则是一个字典dict,并且args只能位于kwargs的前面。代码的运行结果如下
Required argument: 1
<class 'dict'>
Optional argument (args): 2
Optional argument (args): 3
Optional argument (args): 4
Optional argument k2 (kwargs): 6
Optional argument k1 (kwargs): 5
调用函数
args和kwargs不仅可以在函数定义中使用,还可以在函数调用中使用。在调用时使用就相当于pack(打包)和unpack(解包),类似于元组的打包和解包。
首先来看一下使用args来解包调用函数的代码,
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
args = ("two", 3, 5)
test_args_kwargs(*args)
#result:
arg1: two
arg2: 3
arg3: 5
将元组解包后传给对应的实参,kwargs的用法与其类似。
kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)
#result
arg1: 5
arg2: two
arg3: 3
args和kwargs组合起来可以传入任意的参数,这在参数未知的情况下是很有效的,同时加强了函数的可拓展性。
类
语法
class nameoftheclass(parent_class):
statement
初始构造方法
def __init__(self):
self.data = []
self即代表该类本身(类似于this),任何函数都可以传该参数该方法在构建类的实例时被执行,当然该方法可以传参,并使用self进行赋值
例:
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
声明类实例
x=nameoftheclass()
继承
在class()中传一个class即代表继承于该类,通用父类为object
例:
#!/usr/bin/env python3
class Person(object):
"""
返回具有给定名称的 Person 对象
"""
def __init__(self, name):
self.name = name
def get_details(self):
return self.name
class Student(Person):
"""
返回 Student 对象,采用 name, branch, year 3 个参数
"""
def __init__(self, name, branch, year):
Person.__init__(self, name)
self.branch = branch
self.year = year
def get_details(self):
return "{} studies {} in {} year.".format(self.name, self.branch, self.year)
person1 = Person('x')
student1 = Student('y', 'CSE', 2045)
多继承
python支持多继承,在class()中传多个class即可
删除对象
使用关键字del可以删除实例对象
del
实际上使对象的引用计数减少一,当对象的引用计数变成零的时候,垃圾回收器会删除这个对象。
@property
装饰器
@property
装饰器,@property
装饰器就是负责把一个方法变成属性调用的。
说实话,这玩意让我想到了java的注解,在函数上使用该装饰器,可以把该函数当成属性来调用,返回值为一个property对象(实际上所有装饰器都返回一个函数或者对象,作用就是为指定函数/属性添加功能,即进行切面)
装饰器
装饰器的作用就是为函数增加功能(切面),@的写法相当于语法糖
def debug(func):
def wrapper(*args, **kwargs): # 变参
print "[DEBUG]: enter {}()".format(func.__name__)
return func(*args, **kwargs)
return wrapper
@debug
def say(something):
print "hello {}!".format(something)
可以看到,debug为装饰器,实际上就是一个函数,内部包装一个函数,将函数say织入wrapper然后返回,在过程中完成了一些功能。
文件
- 使用 open() 函数打开文件,两个参数,第一个是文件路径,第二个是模式r/w/a(追加)
- 默认的模式为只读模式,返回一个文件(class)
- close():关闭文件
- read():一次性读取整个文件,read(size) 有一个可选的参数 size,用于指定字符串长度
- readline() :每次读取文件的一行
- readlines() :读取所有行到一个列表中。
- 使用for...in...循环遍历文件中的每一行
- 通过write() 方法写入文件,参数为内容
异常
使用 try...except 块来处理任意异常
try:
statements to be inside try clause
...
except ExceptionName:
statements to evaluated in case of ExceptionName happens
使用 raise 语句抛出一个异常
finally子句必定执行
模块
一个模块就是一个.py文件
导入模块
import xxx
from xxx import yyy,zzz
获取模块的名字
可以由全局变量__name__获取模块的名字
包
一个包包含了多个子模块,在一个目录下如果含有__init__.py文件,那么该目录就是一个包,__init__.py中的内容也有一些规则,声明列表__all__表明只有列表中的内容会被当做模块。
常用模块
os
os
模块提供了与操作系统相关的功能。getuid()
:返回当前进程的有效用户 id。getpid()
:返回当前进程的 id。g
etppid():
返回父进程的 id。uname()
:返回识别操作系统的不同信息,在 Linux 中它返回的详细信息可以从uname -a
命令得到。uname()
返回的对象是一个元组,(sysname, nodename, release, version, machine)
>>> os.uname()
('Linux', 'd80', '2.6.34.7-56.fc13.i686.PAE', '#1 SMP Wed Sep 15 03:27:15 UTC 2010', 'i686')
- getcwd() :返回当前工作目录。
chdir(path)
:更改当前目录到 path。
>>> os.getcwd()
'/home'
>>> os.chdir('Code')
>>> os.getcwd()
'/home/Code'
- listdir(path):返回路径中的所有文件和路径
官网:https://docs.python.org/3/library/os.html
requests
一个第三方http库,用于进行网络编程
安装使用:sudo pip3 install requests