课时5:字符串-基础
切片,索引
s = "use python do somenthing
s[1],s[-1],s[1:3],s[1:6:2],s[1:],s[:-1],s[:]
spilt,join,[start:stop:step]
常用方法集合
"let us" + s, s*2 #字符串重复
s.upper()
s.find('pa')
s.replace('python','java')
print "%s like %s" %('we','python')
strip() #返回去除两侧空格(不包括内部)的字符串
转义r''
s="C:\newpython",print s,len(s)
r'\n\ #前缀字符串,不考虑转义
s=r"C:\newpython"
Unicode u''
coding:utf-8
课时6:字符串-re
import re
# Regular expression
re.match(p,text)
re.search(p,text)
re.findall(p,text)
re.split(p,text)
re.sub(p,s,text)
pattern = re.compile(p)
results = pattern.match(text)
整体模式
11个元字符:\
,^
,$
,.
,|
,?
,*
,()
,[]
,{}
,
特殊含义:\
,.
可选:|
,[]
重复:*
,+
,?
,{}
,(贪婪模式)
6个字符类:\d
,\D
,\s
,\S
,\w
,\W
4个位置类:\b
,\B
,\A
,\Z
,C^
、$)
分组:()
编译选项:I
、L
、M
、S
、U
、X
^ start
$ end
. except \n
+ 1-inf
* 0-inf
? 0-1
[] or
{} repeat
[^] not
课时7 日期和时间
Datetime
日期: Datetime.date.today()
日期和时间: datetime.datetime.now()
1000天之后是哪一天: datetime.timedelta(days=1000)
打印格式的问题: Isoformat(),strtime()
字符串转换: strptime()
time
Datetime.time(12,11,30)
Time.time() #实际时间
Time.clock() #cpu时间
Time.sleep() #以s为时间
import datetime
课时8 列表
切片,索引,引用
a = [1,2,3]
a_ref = a
a[2] = 100
常用操作
a_copy=a[:]
a.append(300)
a.insert(1,50)
a.pop()
a.sort()
a.reverse()
del a[1]
嵌套
b = [a,a_ref,a_copy]
c = [1,2,'123','abc']
+,* Count(val) #对某个元素计数(多态函数)
元组
不可变的列表
(a,b,c) #不能原处修改
常用操作
index
count #对某个元素计数
+,*
嵌套: 可嵌套可变的list
转换: tuple()
课时9 字典
Key-Value
dict = {'xiaoming':90,'xiaohong':80,'xioamao':60}
dict,zip
常用操作
Keys,values
Get
Update
Del
Clear
嵌套
散列表,没有顺序,适合插入,查询操作
Key
不一定是字符串,但一定是不可变对象(数字,字符串,元组)。
[(k,dict[k] for k ins sorted(dict,keys())] #列表解析
sorted(dict.iteritems()key=lambda d:d[1],reverse=True)
再谈引用和拷贝
#引用
L = [4,5,6]
X = L*4,Y = [L]*4
L[1] = 0
print X,Y
#浅拷贝
字典D.copy(),copy.copy(D)
列表L[:]
#深拷贝
copy.deepcopy(D)
#将两个等长度的list合并成dict
text = 'C++ python shell ruby java javascript c'
code_num = [38599,100931,26153,93142,84275,184220]
text_list = text.split(' ')
code_dict = dict(zip(text_list,code_num))
#get
a = code_dict.get('fortran',None)
#update,del,copy,clear
other_code = {'php':78014,'objective-c':34444}
code_dict.update(other_code)
del code_dict['c++']
#sort key and value 列表解析
[(k,a_copy[k]) for k in sorted(a_copy.keys())]
课时10 文件
#常用操作
F = open(path,'r') #返回对象为file-like object
#还可以是内存,网络等,r,w,a
F.read()
F.readline()
F.write()
F.close()
#中文支持
import codecs
f = codecs.open(filename,mode,encoding)
#文件操作
import os
os.path.exists(filename)
os.rename(old,new)
#Shelve库
import shelve
D = Shelve.open(file)
D['name']='newtext'
D.close()
#Pickle/cPickle
import cPickle
f = open(file,mode)
cPickle.dump(obj,f)
Obj = cPickle.load(f)
课时11 作业参考
11.1 验证E-mail正则表达式
import re
text='aaa@163.com chu-tian-shu_1981@heibanke2015.com abc-fff@xfd.org ccc_fd2@fff.edu aaa@111 com'
print(re.findall(r'(\w+[-\w]*)@([a-zA-Z0-9]+)\.(com|org|edu)',text))
11.2 随机函数
利用随机函数产生一个用户的用户名,密码,并利用文件将用户名和密码保存下来。
import random
charactor='abcdefghijklmnopqrstuvwxyz0123456789'
len_char = len(charactor)-1
# generate name
a=[0]*4
a[0]=charactor[random.randint(0,len_char)]
a[1]=charactor[random.randint(0,len_char)]
a[2]=charactor[random.randint(0,len_char)]
a[3]=charactor[random.randint(0,len_char)]
name=''.join(a)
# generate password
a=[0]*6
a[0]=charactor[random.randint(0,len_char)]
a[1]=charactor[random.randint(0,len_char)]
a[2]=charactor[random.randint(0,len_char)]
a[3]=charactor[random.randint(0,len_char)]
a[4]=charactor[random.randint(0,len_char)]
a[5]=charactor[random.randint(0,len_char)]
password=''.join(a)
#write file
f=open('a.txt','w')
f.write(name+','+password+'\n')
f.close()
11.3 密码加密
上面的文件中密码没有加密,不安全,请将文件内容读出后将密码字段通过md5的库处理后,再保存至另一个文件。
#md5加密数据库
import hashlib
hashlib.md5(password).hexdigest()
11.4 公交车数据读取,存入字典
#!/usr/bin/env python
# coding: utf-8
import codecs
import re
# read the file
# f=codecs.open('beijing_jt.csv','r','utf-8')
# read_list=[]
# read_tmp=f.readline()
# for i in range(0,39):
# read_tmp=f.readline()
# read_list.append(read_tmp)
# f.close()
f=codecs.open('beijing_jt.csv','r','utf-8')
read_tmp_total=f.readlines()
f.close()
# get linenum and stations information
s_tmp=''.join(read_tmp_total[1:40]) #read_list
jt_info=s_tmp.split(',')
jt_stations = jt_info[-1].split('\r\n \r\n')
print jt_info[1]
# convert stations info format
station_pattern = (r'(?P<number>[0-9]+)\s(?P<name>\D+)')
station_list = []
stations = re.findall(station_pattern,jt_info[-1])
for tmp in stations:
print tmp[0],tmp[1].strip()
station_list.append(tmp[1].strip())
print "-------------------------------------------------"
for tmp in jt_stations:
stations = re.search(station_pattern,tmp.strip())
print stations.group('number'),stations.group('name')
result={}
result[jt_info[1]]=station_list
print result
# coding: utf-8
import csv
import re
csvfile = open('beijing_jt.csv','r')
reader = csv.reader(csvfile)
reader.next()
jt_info = reader.next()
print jt_info[1].decode('utf-8')
csvfile.close()
# convert stations info format
station_pattern = (r'(?P<number>[0-9]+)\s(?P<name>\D+)')
station_list = []
stations = re.findall(station_pattern,jt_info[-1].decode('utf-8'))
for tmp in stations:
print tmp[0],tmp[1].strip()
station_list.append(tmp[1].strip())
result={}
result[jt_info[1]]=station_list
print result
课时12 赋值,输入输出语句
赋值
a,b = 1,2
a,b = "bj",'sh"
a,b = "bj"
a = b = "bj"
a,*b = "beijing"
a,b = (1,2)
a,b = [1,2]
+=
输入
input
raw_input() #原始输入
input()
输出
#3.x
#函数
print([obj,...][,sep=''][,end='\n'][,file=sys.stdout]
#2.x
#语句
print a,b
print >> file,a,b
print '%d,%d,%s'%(a,b,c)
print"{0}like{1}".format('we','python')
print"{a} like {b}".format(a='we',b='python')
课时13 if语句和for循环语句
#if
if xxx:statement1
elif xxx:statements2
else:statements3
#其他用法
#逻辑表达式
not/and/or
#三元表达式
a = y if x > 0 else z
#避免混用Tab和空格
#Pass
#分号
#换行:括号匹配和反斜线
#while/else
While xxx:
statements1
if xxx:break/continue
else:
statements
#for/else
#列表,字符串,元组,字典,文件
for x on objects:
statenments
if xxx:break/continue
else:
statements 2
课时14 列表解析和异常
列表解析
列表分析不但解决而且运行速度较快。
用法
#去除列表中重复元素
l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not in l2]
print l2
举例
>>> iter=(x**2 for x in range(10) if x%2 == 0)
>>> iter
<gennerator object <genexpr> at 0x02419CB0
>>> for el in iter:
print el
print[(x,y) for x in (1,2,3,4) for y in (10,15,3,22) if x*y > 25]
异常
用法
try/except #try后语句有异常发生后执行except
try/finally #无论异常是否发生都执行finally
raise error(meassage) #触发异常
Assert condition,message #条件触发错误,触发后打印信息,并终止程序
举例
a[1] #NameError,a无定义
a = 2; a[1]; #TypeError,定义a为整数,按List去访问
a = [2];a[1]; #IndexError
a = {};a[1]; #KeyError
Raise IndexError
Assert False,"error occur,please check program"
课时15 猜数字
随机产生要猜的数字
输入,用于接收用户输入的数字
循环,如果没猜对则循环接收输入,并打出提示信息
猜到数字或猜测次数达到一定次数后(6次)打印失败并退出
# coding:utf-8
import random
secret = random.randint(1,100)
guess,tries = 0,0
print u"你好,我很幸运,我是一个路过的神仙,我有一个秘密"
print u"我的秘密是一个从1到99的数字,我只会给你6次机会来猜."
print u"如果你猜到它,那说明你很幸运,赶紧去买彩票吧!"
while guess != secret and tries <6:
print u"你猜这个数字是多少?(1-100)"
guess = input()
if guess == secret:
print u"哇~~,真的假的!你居然发现了我的秘密!它就是"
break
elif guess < secret:
print str(guess),u"太小了,你还差点运气!"
elif guess > secret:
print str(guess),u"太大了,你还差点运气!"
tries +=1
else:
print u"你唯一的机会已被你用完了!看来你还需要再攒点人品!"
print u"还是让我告诉吧!这个数字:",str(secret)
问题:
输入非数字
直接输入
secret
(作弊模式)
作业3-1
改进猜数字游戏,放作弊,错误输入判断
作业3-2
利用上次用户密码作业,请模拟注册过程:用户输入用户名后进行检测用户名是否在文件中的过程。并返回合理错误提示。如果不在则再输入密码,成功则增加用户信息到文件中,密码进行md5加密处理。
作业3-3
增加用户名,密码的合法化判断和错误提示。
用户名:字母,数字,下划线和横线的组合,且首字符应是字母,长度不小于4
密码:字母,数字,下划线和横线的组合,且长度不小于6
作业3-4
循环上一课的公交系统作业
利用循环语句将所有线路的linenum
和stations
保存到一个字典对象
执行后提示输入公交站名字,在所有公交线路的stations
里查询该名字,并将包含有该名字的公交线路存到一个字进行返回。
课时16
3-1
# coding:utf-8
import random
secret = random.randint(1,100)
guess,tries = 0,0
print u"你好,我很幸运,我是一个路过的神仙,我有一个秘密"
print u"我的秘密是一个从1到99的数字,我只会给你6次机会来猜."
print u"如果你猜到它,那说明你很幸运,赶紧去买彩票吧!"
while guess != secret and tries <6:
print u"你猜这个数字是多少?(1-100)"
guess_str =raw_input()
try:
guess = int(guess_str)
except:
print u"你输入的不是整数,请重新输入:"
continue
if guess == secret:
print u"哇~~,真的假的!你居然发现了我的秘密!它就是"
break
elif guess < secret:
print str(guess),u"太小了,你还差点运气!"
elif guess > secret:
print str(guess),u"太大了,你还差点运气!"
tries +=1
else:
print u"你唯一的机会已被你用完了!看来你还需要再攒点人品!"
print u"还是让我告诉吧!这个数字:",str(secret)
3-2
# coding:utf-8
import random
secret = random.randint(1,100)
guess,tries = 0,0
print u"你好,我很幸运,我是一个路过的神仙,我有一个秘密"
print u"我的秘密是一个从1到99的数字,我只会给你6次机会来猜."
print u"如果你猜到它,那说明你很幸运,赶紧去买彩票吧!"
while guess != secret and tries <6:
print u"你猜这个数字是多少?(1-100)"
guess_str =raw_input()
try:
guess = int(guess_str)
except:
print u"你输入的不是整数,请重新输入:"
continue
if guess == secret:
print u"哇~~,真的假的!你居然发现了我的秘密!它就是"
break
elif guess < secret:
print str(guess),u"太小了,你还差点运气!"
elif guess > secret:
print str(guess),u"太大了,你还差点运气!"
tries +=1
else:
print u"你唯一的机会已被你用完了!看来你还需要再攒点人品!"
print u"还是让我告诉吧!这个数字:",str(secret)