进入命令: pyhton
退出命令:exit() 或 ctrl+z
python file.py 解释py脚本
源代码: file.py
字节码: file.pyc 已编译
import py_compile
py_compile.compile("file.py")
优化后的源文件:file.pyo
python -O -m py_compile file.py
或在 file.py 加 标准写法
\#!/usr/bin/python
...code...
linux解释py
chmod +x file.py
./file.py # ./ 表示查找#!/usr/bin/python工具解释
#或直接 python file.py
运行 pyc pyo 比直接解释py快
3.3:print (‘str’)
2.6:print ‘str’
strHello = "the length of (%s) is %d" %('Hello World',len('Hello World'))
print (strHello)
print("%.2f + %.2f =%.2f" %(num1, num2, num1+num2))
# %() 多个值须加括号
print(name + " is " + str(age) + " old") # str()将其转为字符串
a = 12
id(a) # 16698208 获取a的地址
b = 12
id(b) # 16698208 z值相同则 与a的地址相同(引用)
# 但 执行 a = a+1后 a地址改变指向 13,而 b不变
type(num1)
type(12) ##显示引用类型 int
a = 123L ##将 123 存取为 long int
复数 a = 2+3j
字符串 a = 'str'
a = "str"
a = """str""" 三重引号(或单引号):注释,doc数据
str="abcde" 字符串 切片
则 str[1:4] ## bcd 下标1开始到4之前
str[:3] str[3:] ## abcd de
str[::2] ## ace 从头至尾 +2 取,2为步长值
str[-1] ## e 最右为-1
str[-4:-1] ## bcd 默认从左往右取
str[4:1:-1] ## dcb 倒着取
整除法 3.0//2 ## 1.0 取整数
幂运算 3**2 ## 9 3^2
逻辑运算符:
与 and
或 or
非 not
global 变量名 ## 强制声明为全局变量
raw_input("请输入一个整数:") 从键盘上读取原始数据 字符串(包括方向键 删除键)
int(raw_input()) 强制转换为int
help(list.append) 查看帮助 q 退出,必须是list
help(len)
range(i,j[,步进值])
i为初始值,不选则默认为0 ## range(10) 0-10
j为终值
步进值默认为1
模块
import funtion ## function.py
function.add(2,5) ## 调用函数
若导入文件与系统文件同名,则先引入指定目录(默认同目录下)的py文件
包
创建一个包名文件夹
在该文件夹下创建__init__.py文件
在文件夹内存放脚本文件或已编译脚本
导入: import pack.mod
# pack.mod.fun()
或 import mod as m
m.fun()
或 from mod import fun
fun()
__name__
在py文件中若被自己调用则值为__main__
若被其他py import调用则值为被调用的文件名
例子 :
FUNCTION.py
#!/usr/bin/python
def machine(x,y='milk'):
print('cost ' + str(x) + ' to buy ' + y)
# if use python FUNCTION.py the __name__ is __main__
# if FUNCTION.py is used by other py, the __name__ is FUNCTION
if __name__ == '__main__':
print('Test the function()...\n')
machine(12)
print('\nComplete!')
IMPORT.py
#!/usr/bin/python
import FUNCTION
print('Testing the IMPORT...\n')
FUNCTION.machine(9999,'computer')
print('\nComplete!')
len(str) ##序列长度
+ ##连接两个序列, str1+str2 拼接
* ##重复序列元素 str1*3 重复3次 "#"*20
in ## 'bc' in str True // not in
max() / min() ## max(str) 取最大字符
cmp(str1, str2) ## 1 则 str1 > str2
## -1 则 str1 < str2
## 0 则 str1 == str2
在内存分配上 python 不同于c语言指针,字符串和元组是不可修改的,
当给变量重新赋值后,该变量的地址也将发生改变
元组 () 也可切片
user = ("Tom", 25, "boy")
则 user[0] ## tom
user[1] = 26 ## 该语句不能被执行,元组不可修改
但user = ("Tom", 26, "boy")可以执行,不过地址发生了改变
name, age, gender = user ## name=Tom age=25 gender=boy
赋值方法也可以这样:a,b,c = (1,2,3)s
一个元素 的元组 a = ("Tom",) //须加个逗号
列表 []
list = ['Tom', 'Lucy', 'Jack', 25]
list.append("info") 添加
list.remove("Tom") 或 del(list[0]) 删除
list[2] = 123 修改 但list地址不变 list[2]地址改变
25 in list 查找
t1 = ["name", "age", "gender"]
t2 = ["Tom", 25, "boy"]
zip(t1,t2) ## [('name', 'Tom'), ('age', 25), ('gender', 'boy')]
dic = {'name':'Tom', 'age':25, 'gender':'boy'}
dic['name'] ## Tom 键名key为 name,也可以为变量
工厂方法 dict()
fdict = dict(['x',1],['y',2])
内建方法 fromkeys() 各元素的具有相同的值
ddict = {}.fromkeys(('x','y'), -1)
遍历输出字典内容
for k in dic:
print(k) ##键名
print(dic[k]) ##值
del dic['name'] ## 删除
dic.pop('name') ## 删除并返回键名为'name'的元素值
dic.clear() ## 删除字典所有的元素
del dic ## 删除整个字典
dic['tel'] = '12345' ## 增加
dic.get('name','Get error!') ## 找到返回值 否则 返回错误信息
dic.keys() ## 返回所有的键名
dic.values() ## 返回所有的值
if语句
if 条件:
命令 ## 命令每行缩进相同则视为同一等级(四个空格)
if 条件: ## elif 和 else 要与 if 对其
命令 ## 可以嵌套 但需注意对齐
elif 条件:
命令
else:
命令
与 and 或 or 非 not
例子:
#!/usr/bin/python
def get_score():
return int(raw_input("Please input a score: "))
print("Testing the if: ")
score = get_score()
if score >= 90 and score <= 100:
print("90-100")
elif score >= 60 and score < 90:
print("60-89")
elif score >=0 and score <60:
print("0-59")
else:
print("%d-Invalid Input!" % score)
print("Complete!")
for循环:
for iterating_var in sequence:
statements
for x in seq:
print('...')
else:
print('...') ##非正常时不会显示
## Ctrl + c 停止程序
for 也有 break continue
pass 作为占位用 不做任何操作
exit() 跳出整个程序
例子:
#!/usr/bin/python
print('Testing the FOR...\n')
fruits = ['banana', 'apple', 'orange']
for i in range(len(fruits)):
print('Current fruit is: %s' %fruits[i] )
print('\n')
dic = {'name':'Tom', 'age':25, 'gender':'boy'}
#for in dictionary method 1
for x in dic:
print('%s : %s' %(x,dic[x]))
print('\n')
#for in dictionary method 1
for x,y in dic.items():
print(x)
print(y)
print('\nComplete!')
例子:
#!/usr/bin/python
print('Test the for-else....\n')
for x in range(1,5):
print(x)
if x == 3:
break
else:
print('End')
print('\n')
print('-'*10)
for x in range(1,5):
print(x)
if x == 2:
pass
if x == 3:
print('#'*5)
else:
print('End')
print('\nComplete!')
while 循环
while 条件:
statements
例子:
#!/usr/bin/python
print('Test the while...\n')
while True:
key = raw_input("Input \'q\' or enter to quit:")
if not key:
break
if key == 'q' or key == 'Q':
break
else:
print('End')
print('\nComplete!')
switch 语句
例子:
#!usr/bin/python
#coding:utf-8
from __future__ import division
def add(x,y):
return x+y
def sub(x,y):
return x-y
def multi(x,y):
return x*y
def div(x,y):
return x/y
print('Now testing the method that realize the SWICTH by using dictionary\n')
## the first way use if-else
def oper_before(x,str,y):
r = 0
if str == '+':
r=add(x,y)
elif str == '-':
r=sub(x,y)
elif str == '*':
r=multi(x,y)
elif str == '/':
r=div(x,y)
else:
pass
print(r)
oper_before(5,'*',9)
## the second way to realize SWICTH
oper = {'+':add, '-':sub, '*':multi, '/':div}
def oper_after(x,str,y):
print oper.get(str)(x,y)
oper_after(4,'+',7)
print('\nComplete!')
定义函数
def 函数名(参数):
函数体
#coding:utf8
#coding=utf8
#encoding:utf8
#encoding=utf8
#-*- coding:utf8 -*-
def fun(name="Null",age=0):
print("%s : %d" %(name,age))
参数为元组(参数个数要相对应)
t = ('Jack',19)
fun(*t)
参数为字典(键名需要和函数形参名匹配)
d = {'name':'Jack','age':19}
fun(**d)
def f(x,*args):
print(x)
print(args)
## args接收元组,以接收多余的参数
## f(x,**args) 接收多余的 赋值参数f(1,a=125)
匿名函数 lambda
f=lambda x,y:x*y ## 调用 f(2,3)
## 等同于 def f(x,y): return x*y
reduce(function,list)
l = range(1,6)
def f(x,y):
return x*y
reduce(f,l)
## 结果为阶乘 6! reduce在列表l中依次函数f的参数个数的值,将其结果又作为函数的参数,再在列表中取值
abs(number) # 求绝对值
max() # 求序列中最大的值
min() # 求序列中最小的值
len() #求序列长度
divmod(5,2) #返回两数的商和余的元组
pow(x,y) # 返回x**y
round(254,2) # 返回值得小数形式(保留2位小数)
callable(fun) # 测试函数fun是否可调用
isinstance(l,list) # 测试变量的类型(a,int) ...
## if type(l)==type([]) 判断l是否为列表
cmp(str1,str2) # 比较两个字符串,前面大1,相等0,前面小-1
强制类型转换
int() long() float() tuple()
str() list() hex() oct() chr() ord()
str.capitalize() 将字符串的首字母大写
str.replace('old','new') 替换字符串(默认替换所有匹配字符串)
str.split('_') 切换 _ 隔开的字符,返回列表
## 当 import String
## 改用为 str.replace(str,'old','new')
filter(function,sequence) 根据函数中返回的True过滤列表
##def f(x):
## if x>5:
## return True
##filter(f,range(1,8)) ## [6,7,8]
zip(l1,l2) # 合并几个列表,每个列表依次取值构成新列表,以最短列表长度为合并后列表长度
# 合并几个列表,长度不足者取值None
map(None,l1,l2)
# 对合并后的列表每个元组进行函数fun处理后再得到新列表
map(fun,l1,l2)
## l1 = [1,3,5]
## l2 = [2,4,6]
## l3 = [7,8]
## zip(l1,l2,l3) -> [(1,2,7),(3,4,8)]
## map(None,l1,l2,l3) -> [(1,2,7),(3,4,8),(5,6,None)]
## def fun(x,y): return x+y
## map(fun,l1,l2) -> [3,7,11]
# 1-99的偶数累加器
reduce(lambda x,y:x+y, filter(lambda x:x%2==0, range(1,100)))
import re
pattern = r'abc'
re.findall(pattern,'abcrgriabcgjr')
## 直接解释 返回找到的所有abc的列表 ['abc','abc']
r'a[bd]c' ## abc adc
r'a[^bd]c' ## 在方括号中 表示出了abc adc的
r'^abc' ## 行首为 abc 的
r'abc$' ## 行尾为 abc 的
'''
\d -> [0-9]
\D -> [^0-9]
\s -> [\t\n\r\f\v] 匹配任何空白字符
\S -> [^\t\n\r\f\v] 匹配任何非空字符
\w -> [a-zA-Z0-9_] 匹配字母数字
\W -> [^a-zA-Z0-9_] 匹配非字母数字
'''
r'^010-?\d{8}$' ## 010-12345678 8位数字
r'ab*' ## a后面有0或多个b
r'ab+' ## a后面至少有1个b 贪婪模式 显示所有b
r'ab?' ## a后面有1个或0个b
r'ab+?' ## 非贪婪模式,只显示1个b
{m,n} ## 至少重复m次,至多重复n次
p_tel=re.compile(pattern)
## 编译正则 比解释快
p = re.compile(r'agar',re.I)
## 忽略大小写
## re.S 使 . 匹配包括换行在内的所有字符
## re.M 多行匹配,影响 ^ $
## re.X 忽略pattern的多行中换行符
r'\str' ## r 可以使反斜杠不会被任何特殊方式处理
x = p.match('str') ## 若匹配成功(匹配数据在str最前面)则返回该对象,否则为空
x.group() ## 显示所有匹配的结果
p.search('str') ## 匹配成功(任意位置)返回对象
p.finditer('str') ## 返回迭代对象
# re模块
re.sub(pattern, 替换成str,原始str) ## 替换
re.subn(pattern, 替换成str,原始str) ## 替换并返回替换的个数
str.split('_') ## 根据 _ 分割
re.split('[\+-\*]',str) ## 根据pattern分割
# 分组( )
p=r"\w{3}@w+(\.com|\.cn)"
re.findall(p."[email protected]") ## .com 优先返回分组内的内容
re.match(p."[email protected]").group() ## [email protected] 返回全部
例子:
#!/usr/bin/python
import re
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.*?\.jpg)"'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
return imglist
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,"./tmp/%d.jpg" %x)
x++
html = getHtml("http://tieba.baidu.com/p/1840199283")
getImg(html)
浅拷贝:对引用的拷贝(只拷贝父对象)
深拷贝:对对象的资源的拷贝
浅拷贝
import copy
a = [1,2,'a','b']
b = a ## a和b地址相同,任一个改变两个都变
c = copy.copy(a) ## 地址与a不同,且不随a改变(前提为非更改父对象的改变)
## 但是 id(a[0]) == id(c[0]) 父对象共用,一方改变父对象数据,都要改变
深拷贝
d = deepcopy(a)
file_handler = open(filename,mode)
f = open('./test.txt','w')
f.write("str...")
f.read() ## 读取整篇文章的数据
f.close() ## 关闭后,才会将写入的数据(在缓冲区)写入到文件中
open(path,"r+") ## r+ 为读写操作,指针默认在首位,写入的内容在光标后
open(path,"w") ## 读写,先删除原文件或没有时新建一个
open(path,"a") ## 写入,文末追加或新建
str = f.readline() ## 读取一行, 超出后返回空字符串
f.readlines() ## 返回每行的列表
f.write(str) ## 清空以前内容
f.writekines(List) ## 多行写入
f.seek(偏移量,选项) ## 选项=0,指向从文件头到偏移量处
## 选项=1,从当前位置向后移动偏移量
## 选项=2,从文件的尾部向前移动偏移量
f.flush() ## 数据提交,断点续传(不用先关闭文件后才能生效)
os.mkdir('dir_test'[, mode=0777]) ## 创建文件夹, 权限
rmdir(path) ## 删除文件夹
listdir(path) ## 列出文件夹
getcwd() ## 获取当前路径
chdir(path) ## 切换目录
isdir(path) ## 是否为目录
walk(path) ## 遍历
例子 OS_LIST_DIR_FILE:
#!/usr/bin/python
#coding:utf8
import os
def dirList(path):
pre_path=path
list=os.listdir(pre_path)
for name in list:
all_path=pre_path+'/'+name # or all_path=os.path.join(pre_path,name)
if(os.path.isdir(all_path)):
dirList(all_path)
else:
print(all_path)
def dirList_walk(path):
all=[]
for pre_path,dir_list,file_list in os.walk(path):
for file_name in file_list:
all_path=os.path.join(pre_path,file_name)
all.append(all_path)
return all
path='/home/jiecxy/Public/py/tmp/dirList'
print(dirList(path))
print('\n\n')
print(dirList_walk(path))
print('\n\n')
try:
statements
except Error,msg:
statements
fianlly:
statements
# 自定义异常
raise TypeError(ErrMsg)
例子:
#!/usr/bin/python
try:
print('In try before\n')
f=open('no_exist.py')
print('In try after\n ')
except IOError, msg:
print('Open file exception!')
finally:
try:
f.close()
except NameError, msg:
pass
print('In finally!\n')
'''
class 类名:
成员变量
成员函数 ## 类的方法中至少有一个参数self
'''
class Test:
var = 1
def fun(self):
return 'test'
# 实例化
t = Test()
例子:
#!/usr/bin/python
import MySQLdb
conn=MySQLdb.connet(user='root',passwd='',host='127.0.0.1')
cur=conn.cursor()
conn.select_db('test_py_mysql')
cur.execute("insert into userinfo(name,age,gender) value('Jack',20,'boy')")
## sql_add="insert into userinfo(name,age,gender) value(%s,%d,%s)"
## cur.execute(sql_add,('Jack',20,'boy')) ## the second para is tuple
## sql_adds="insert into userinfo(name,age,gender) values(%S,%d,%s)"
## cur.executemany(sql_add,[('Jack',20,'boy'),('Lucy',19,'girl')]) ## the second para is list
cur.execute("select * from userinfo")
tuple=cur.fetchone() ## return one record every time
cur.scroll('0','absolute')
cur.fetchmany(10) ## return 10 records
cur.fetchmany(cur.execute("select * from userinfo")) ## return all records
cur.close()
conn.close()
将句子分词
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 18 15:18:09 2015
@author: jiecxy
"""
def load_dict(filename):
f = open(filename)
word_dict = set()
max_len = 1
for line in f:
word = unicode(line.strip(), 'utf-8')
word_dict.add(word)
if len(word) > max_len:
max_len = len(word)
f.close()
return max_len, word_dict
def fmm_word_seg(sent, max_len, word_dict):
begin = 0
words = []
sent = unicode(sent, 'utf-8')
while begin < len(sent):
for end in range(begin + max_len, begin, -1):
if sent[begin:end] in word_dict:
words.append(sent[begin:end])
break
begin = end
return words
max_len, word_dict = load_dict('./temp/lexicon.dic')
sent = raw_input('请输入一个中文句子: ')
words = fmm_word_seg(sent, max_len, word_dict)
for word in words:
print word
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 17 21:00:07 2015
@author: jiecxy
"""
def linear_search(list, x):
for i in range(len(lst)):
if lst[i] == x:
return i
return -1
def binary_search(lst, x):
low = 0
high = len(lst) + 1
while low <= high:
mid = (low + high) / 2
if lst[mid] == x:
return mid
elif lst[mid] > x:
high = mid - 1
else:
low = mid + 1
return -1
def selection_sort_v1(lst):
for i in range(len(lst)):
min_index = i
for j in range(i + 1, len(lst)):
if lst[j] < lst[min_index]:
min_index = j
lst.insert(i, lst.pop(min_index))
def swap(lst, i, j):
tmp = lst[i]
lst[i] = lst[j]
lst[j] = tmp
def selection_sort_v2(lst):
for i in range(len(lst)):
min_index = i
for j in range(i + 1, len(lst)):
if lst[j] < lst[min_index]:
min_index = j
swap(lst, i, min_index)
def bubble_sort(lst):
top = len(lst) - 1
is_exchange = True
while is_exchange:
is_exchange = False
for i in range(top):
if lst[i] > lst[i + 1]:
is_exchange = True
swap(lst, i, i + 1)
top -= 1
# main
lst = [42, 16, 84, 12, 77, 26, 53]
#sort(lst)
lst.sort()
print lst
# -*- coding: utf-8 -*-
def is_leap_year(year):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
return True
else:
return False
def get_num_of_days_in_month(year,month):
if month in (1,3, 5, 7, 8, 10, 12):
return 31
elif month in (4, 6, 9, 11):
return 30
elif is_leap_year(year):
return 29
else:
return 28
def get_total_num_of_days(year, month):
days = 0
for y in range(1000, year):
if is_leap_year(y):
days += 366
else:
days += 365
for m in range(1, month):
days += get_num_of_days_in_month(year, m)
return days
def get_start_day(year, month):
return (3 + get_total_num_of_days(year, month)) % 7
print get_start_day(2015,1)