【學習筆記】用python作些事

課時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^$)
分組:()
編譯選項:ILMSUXjavascript

^    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
嵌套

散列表,沒有順序,適合插入,查詢操做php

Key不必定是字符串,但必定是不可變對象(數字,字符串,元組)。java

[(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正則表達式

clipboard.png

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 隨機函數

利用隨機函數產生一個用戶的用戶名,密碼,並利用文件將用戶名和密碼保存下來。python

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的庫處理後,再保存至另外一個文件。c++

#md5加密數據庫
import hashlib
hashlib.md5(password).hexdigest()

11.4 公交車數據讀取,存入字典

clipboard.png

#!/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 列表解析和異常

列表解析

列表分析不但解決並且運行速度較快。正則表達式

用法objective-c

#去除列表中重複元素

l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not in l2]
print l2

舉例shell

>>> 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    #條件觸發錯誤,觸發後打印信息,並終止程序

舉例express

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 猜數字

  1. 隨機產生要猜的數字

  2. 輸入,用於接收用戶輸入的數字

  3. 循環,若是沒猜對則循環接收輸入,並打出提示信息

  4. 猜到數字或猜想次數達到必定次數後(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)

問題:

  1. 輸入非數字

  2. 直接輸入secret(做弊模式)

做業3-1

改進猜數字遊戲,放做弊,錯誤輸入判斷

做業3-2

利用上次用戶密碼做業,請模擬註冊過程:用戶輸入用戶名後進行檢測用戶名是否在文件中的過程。並返回合理錯誤提示。若是不在則再輸入密碼,成功則增長用戶信息到文件中,密碼進行md5加密處理。

做業3-3

增長用戶名,密碼的合法化判斷和錯誤提示。

用戶名:字母,數字,下劃線和橫線的組合,且首字符應是字母,長度不小於4
密碼:字母,數字,下劃線和橫線的組合,且長度不小於6

做業3-4

循環上一課的公交系統做業

利用循環語句將全部線路的linenumstations保存到一個字典對象

執行後提示輸入公交站名字,在全部公交線路的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)

課時16 做業參考

相關文章
相關標籤/搜索