此处指定为python3的可执行程序,python 3版本没有向前兼容
在 Python 中空白非常重要。实际上,在每行开头的空白很重要。称之为缩进。 在行首的主要的空白(空格键和制表符)用来决定逻辑行缩进的层次,从而来决定语 句分组。
这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块
基本的输入和输出
输入: name = input("please input your name")
输出: print("your name is ",name)
基本编码文本格式设置为UTF-8
# -*- coding:UTF-8 -*-
# coding=UTF-8
注意:
python大小写敏感!!!
缩进十分严格!!!
# 是单行注释
''' 可以作为多行注释即可。 只要没有变量引用它 它就不是字符串,变为多行注释。
何模块代码的第一个字符串都被视为模块的文档注释
数据类型
整数(int) 不可变
十进制数非0不能以0开头。例如 0100是错误的
二进制表示: num = 0b
八进制表示: num = 0o
十六进制表示: num = 0x
浮点数
普通表示: num = 1.78
科学计数法: num = 1.78e5 1.78的5次方
字符串 不可变
单引号: ' str '
双引号: " str2 "
三引号: ''' str ''' 三引号不用使用"\"换行符,当字符串很长的时候,通常使用单引号和双引号的时候,跨行是要加\才能跨行。使用三引号不用关心此问题
默认加反斜杠\是可以转义的,但是若想不转义,分别在前面加上r即可。例如
str = r'str\t' # 效果 str\t
str2 = r"str2\n" #效果 str2\n
str3 = r''' str3\n''' #效果 str3\n
字符串反转:
str[::-1] #切片法
序列化为unicode编码: 'str'.encode('UTF-8') # 编码
反序列化unicode编码: b'str'.decode('UTF-8') # 解码
格式化输出1: print("you name is %s and age is %d" % (name,age))
字符串拼接使用 加号+ 例如 str2 = "hello"+"world"
也可以省略加号 直接 str2 = "hello""world"
布尔值
真: True
假: False 0 0.0 [] () {} "" None
bool类型 是int的子类 。
bool继承自 int 所以 int+bool是可以运算的。
例子: True是1 False 是0
print (2+True) # 3
print(3+False) # 3
isinstance(obj,class_name) # 判断是否是某一个类的实例
is # 判断两个的id是否一致 通过内存id判断是否是同一个引用
例如 a = 20 b = 20 a is b # True
type函数返回的是类型 而不是字符串 例如:
a = 20 type(a) == int # True 返回值是真
list 数组是可变的。其实所谓的可变和不可变就是,通过list"对象" 点 通过执行方法就可以改变原来的内容。
tuple 元组是不可变的。不能对他增删改查。 不可变只能拷贝 不能修改。
空值
空: None
list(列表)
list说白了就是可变数组: 定义 array = [1,2,3]
求数组长度: len(array)
添加元素 array.append(4)
删除最后一个元素: array.pop()
获取最后一个元素: array[-1]
头部插入一个元素: array.insert(0,1)
常见遍历:
for index in arr:
print(index)
tuple (元组) 不可变
tuple说白了就是不可变数组。定义 const array = (1,2,3)
只定义一个单元素的元组: tuple = (1,) #加一个逗号区分 若没有逗号则以为是tuple=1
此时不能对tuple进行append pop操作。也就是该元组已经确定了,不能修改。但是必须理解一个特殊情况。所谓的不变是指的"指向"不变
例如: arr = [1,2]
tuple = (arr,4,5,6)
此时 tuple[0][1] = 100 #此语句不会出错
因为此时我并没有对tuple进行结构上的增删改,此时操作的对象是arr而不是tuple本身。 例如 tuple[4] = 5 #此时会出错 因为此时在修改tuple结构
dic(字典:dictionary )
字典说白了就是json字符串的形式,key-value.
定义 : person = {'name':'张三','age':20}
获取值: person['name']
赋值: person['age'] = 20
尝试通过key获取值: person.get('key','default-value')
遍历:
for key,val in person.items():
print(key,val)
set(特殊的字典)和dict也是成对的
set里面只有key,没有对应的value.接收一个list作为参数,只能放入不可变数据类型,如字符串 整数,不能放入list等可变变量。
set1 = set([1,2,3])
set2 = set([4,5,6])
#交集 set1 & set2
#并集 set1 | set2
#尝试往set1加入一个list
set1.add([7,8,9]) # 此时会报错
分支跳转和循环
if 条件 :
if():
#coding...
else:
#coding....
if 条件 : .... elif 条件 :.....else:....
循环 (for循环和while循环)
for item in items :
#coding....
range(5) # 生成一个 [0,1,2,3,4] 的序列
range(9,0) #倒序生成 [9 8 7 6 ... 1]
while 循环
while(true):
#coding...
函数(function)
数据类型转 int() float() bool() str() list() tuple()
pass表示暂时让程序跑起来,后面再写。否则不写pass则出错
def function_name(x1,x2):
#coding....
使用 return 返回。默认没有写return 则 retrun None
可以返回多个值。例如 return x1,x2 其实本质上是返回一个tuple
(x1,x2) 然后用变量按照位置赋值即可,类似php中的list(x1,x2) = [1,2]
默认参数: 和php用法一致。但是默认参数必须是不可变类型,如str,int,tuple.否则会出现一个怪相。
def test(arr=[]):
arr.append(1)
调用3次test()后 会出现[1,1,1]会累加。 其实这么理解,可变参数就是引用,直接修改值,但是非可变变量类型才是浅拷贝,不会影响本身。
可变参数: 加一个*号 转换参数到function里面变为一个tuple
def function_name(*args) :
#coding....
function_name(1,2,3,4,5)
也可以直接传一个数组list进去,但是得加上一个*号
list = [1,2,3,4,5]
function_name(*list)
关键词参数: 传入的值变为json形式传入
定义:
def function_name(name,age,**person):
function_name('zhangsan',20,city="beijing",counrty="china")
会出现person = {'city':'beijing','counrty':'china'}
也可以组装好再传入:
function_name('zhangsan',20,**person)
命名关键词字参数:
和上面的关键词参数一样,只是限制这个json拥有哪些key的问题。例如限制只有city和counrty的key.
def function_name(name,age,*,city,counrty):
pass
参数顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
切片
例如针对 list tuple string 截取某一段的值
如 : arr=[1,2,3,4,5]
取前三个: arr[:3] 1,2,3 不包括最后一个下标,只包括前面的下标
取最后三个: arr[-3:-1]
每隔n个取一个: arr[::2] 每隔2个取一个 1,3,5
迭代
数组list tuple dic str都是可以迭代的对象。dic默认迭代key,list迭代value
for key in dic
for value in list
迭代value:
for value in dic.values()
迭代key和value:
for key,value in dic.items()
遍历数组常用方法: #可以获取key 和val
for key,val in enumerate(list):
判断是否是某一个类的实例对象
from collections import Iterable
isinstance(obj,Itrable) # 判断obj是否属于Itrable的子类
函数名也是变量。 a = abs 完全是可以的,再调用a(-1) 等同 abs(-1),也可以把函数作为参数传进去。
匿名函数和返回值可以是函数
add = lambda x:x**2
相当于定义函数:
def add(x):
return x**2
特殊变量和模块
模块目录需要有 __init__.py文件
_开头或者__开头的函数/变量是只属于该模块使用的, 对外部不可见。相对于php来说, 对每个function都有 公开和私有的说法。
pip3安装模块 。
pip3 install module_name
面向对象
class的定义:
class Student(object):
pass
实例化: student = Student()
类属性可以直接写:
class Student(object):
name = "zhangsan"
类似php自由添加属性. student.name = "zhangsan"
构造函数: self必传 self相当于this 。默认第一个参数必须是self。
def __init__(self,name,age)
访问限制: 加上__开头即可表示 private
析构函数: __del__(self):
静态方法加: @staticmethod @classmethod
初始化父类: super().__init__(参数)
使用 type(obj) #查看obj的数据类型
hasattr(obj,'attr') #测试是否有attr属性
getattr(obj,'attr_name','default_value') #获取属性值 获取方法也可以
fn = getattr(obj,'myfun')
fn() # 作用和obj.myfun()是一样的
__str__:方法类的字符串表示 类似php的__toString()
异常处理
try:
#coding...
except Exception as e:
#coding...
finally:
#coding... 无论如何都会执行 就算前面有exit / quit()都会执行
所有的异常都是继承 BaseException.
raise 抛出异常
raise Exception("错误信息")
IO操作
读取文件: fp = open("1.txt","r",encoding="gb2312",errors='ignore')
str = fp.read()
写入内容: "w" 会覆盖 fp.write("contents"),"a" 追加
文件目录操作 import os
os.path # 对路径进行操作 join split
os.mkdir
os.removedir
os.rename
序列化和反序列化
import pickle
pickle.dumps(obj) # 输出序列化字符串
pickle.dump(obj,fp) #将序列化内容写入文件
转为json
import json
json.dumps(obj) #转为json字符串
json.loads(json_str) #转为python变量
多进程和多线程
Linux: import os
os.fork() //派生出子进程
os.getpid() //当前进程id
os.getppid() //得到父进程id
跨平台widnows: from multiprocess import Process
process = Process(target=execute_function,args=('参数',))
process.start() //开启进程
process.join() //执行成功后继续
Pool进程池: from mutiprocess import Pool
子进程: import subprocess
进程通信: from mutiprocess import Queue
import time,random,time
多线程 threading
import time,threading
t = threading.Thread(target=function_name, name='LoopThread')
t.start()
t.join()
正则表达式
import re
partten = r'^w{3}' # 正则表达式规则
re.match(partten,target_str) # 匹配
常见内置模块
datetime #处理时间
from datetime import datetime
print(datetime.now()) # 当前时间
操作MYSQL数据库
$ pip3 install PyMySQL #先安装pymysql包
$ pip3 install pymysql==0.9.0 #指定版本
1.导出目前项目用到依赖文件:
pip3 freeze > requirements.txt
文件内容如下:
altgraph==0.15
ascii==3.6
asn1crypto==0.24.0
certifi==2018.1.18
cffi==1.11.5
chardet==3.0.4
从依赖文件中导入安装依赖:
pip3 install -r requirements.
2.配置config
config = {
"host":'ip',
"port":3306,
"user":"",
"password":"password",
"charset":"utf8",
"autocommit":True #自动提交事务,
"db":"db",
"cursorclass":pymysql.cursors.DictCursor #字段的数据结构
}
connect = pymysql.connect() 获取连接对象
cursor = connect.cursor() =># 执行sql的具体对象
cursor.execute("insert into table values(%s,%s)",(name,age)) #第二个参数防注入 预编译
connect.commit() # 连接对象 commit 提交
connect.insert_id() #获取插入的id
获取执行的sql语句:cursor._excuted
常见模块:
1.文件,目录操作
2.时间(datetime模块 有一个datetime类)
2.1 当前时间 : datetime.now()
2.2 根据日期获取到时间 datetime(2014,4,5,16,24,56) 2014-4-5 16:24:56
2.3 datetime.timestamp() # 获取时间戳
2.4 时间戳转时间 datetime.fromtimestamp(10100202002)
字符串转时间 datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
时间格式化为字符串:
datetime.strftime("%Y-%m-%d %H:%M:%S")
时间加减: from datetime import timedelta
timedelta(hours=12) # 12小时 然后就是通过+ - 来算时间
3.加密 hashlib (包含 md5等等加密算法)
感谢佛祖,让我们相遇~
还没有人发表评论