Python基础
第一章:初识Python
1.三双引号“““”””可以包含换行符\n,和制表符\t,以及其他特殊字符。
para_str=""" 多行字符串可以使用制表符\t,也可使用换行符\n,甚至是代码#include<stdio.h> int main() { int a = 12; printf(a); }""" print(para_str)
输出如下:
2. 字符串:有n个字符的字符串,从左到右编号为0,1,2,...,n-1;从右到左编号为-1,-2,...,-n。
字符串字符不可修改
用in,not in判断子串
a = "Hello" b = "Python" print('el' in a) print('th' not in b)
输出如下:
3.字符串和数的转换
int(x):把字符串转换成整数
float(x):转换成小数
str(x):把x转换成字符串
eval(x):把字符串x看作一个表达式,求其值
s = input()输入的均为字符串
4.初识列表
输入两个整数求和,默认空格、制表符、换行符
s = input() numbers = s.split(',') print(int(numbers[0])+int(numbers[1]))
第二章:基本运算
1.算术运算中 / 结果是小数
// 求商,结果是整数
**求幂
2.逻辑运算符
and or not
print(2.0 and True)
3.条件分支语句
if int(input()) == 5: print("a",end="") print("b")
4.字符串切片
若S是一个字符串,则S[x:y]是S的下标x到下标y的左边那个字符构成的子串
print("12345"[0:-1]) 输出:1234
5.输出格式控制
%s字符串、%d整数、%f小数、%.nf保留n位小数,注意四舍六入
格式控制符只能出现在字符串中
h = 1.768 print("My name is %s,I am %.2fm tall" % ("tom",h))
第三章 循环语句
1.for
for <variable> in <sequence>: <statements 1> <statements 2> sequence可以是range(),也可以是是字符串、列表、元组、字典、集合
for i in range(0,10,3):
print(i)
输出:
0
3
6
9
for i in range(26): print(chr(ord('a')+i),end='')
连续输出26个字符
2.while
第四章 函数
这是判素函数
def IsPrime(n): if n<= 1 or n % 2==0 and n != 2: return False elif n == 2: return True else: for i in range(3,n,2): if n % i == 0: return False if i * i > n: break return True for i in range(100): if(IsPrime(i)): print(i,end = " ")
递归=概念的定义使用到了这个概念本身
台阶问题: def ways(n): if n == 1: return 1 elif n == 2: return 2 else: return ways(n-1)+ways(n-2) print(ways(4))
汉诺塔: def Hanoi(n,src,mid,dest): #将src座上的n个盘子,以mid为中转,移动到dest座 if n == 1:#只需移动一个盘子 # 直接将盘子从src移动到dest即可 print(src + "->" + dest) return Hanoi(n-1,src,dest,mid) #先将n-1个盘子从src移到mid print(src + "->" + dest)#再将一个盘子从src移到dest Hanoi(n-1,mid,src,dest) #最后将n-1个盘子从mid移到dest n = int(input()) Hanoi(n,'A','B','C')
第五章 字符串和元组
组合数据类型:字符串 str、元组 tuple、列表 list、字典 dict、集合 set
isinstance(x,y)函数查询数据x是否是类型y
print(len({'tom':2,'jack':3}))
Python中的变量都是指针
a is b 为True 说明a和b指向同一个地方
a == b 说明指向地方放的值相同
a = b 将a和b指向同一个地方
转义字符:
print("Hello\nworld\tok\"1\\2") 输出: Hello world ok"1\2
规定'\'不转义的字符串
print(r'ab\ncd') 输出: ab\ncd
# 字符串切片 # a[x:y]表示字符串a里从下标x到下标y那一部分的子串 a = 'ABCD' print(a[1:2]) print(a[0:-1]) print(a[2:]) print(a[:3]) # a[x:y:z]表示,从a[x]到a[y],每z个字符取一个,最后拼起来 print('abcde'[::-1]) #适用与元组和列表
''' 字符串的split函数详解 s.split(x) 用字符x做分隔符分割字符串s,得到分割后的列表 两个分隔符之间会被分割出一个空串 ''' a = '12..34.5346...a' print(a.split('.'))
'''
用多个分割串进行分割
'''
import re
a = 'Beautiful, is; better**than\nugly'
print(re.split(';| |,|\*\*|\n',a))
字符串的函数
# 求子串出现次数 s = 'AAA' print(s.count('AA'))
upper、lower转大小写
s = '1234abc567abc12'
print(s.find('ab')) #'ab'第一次出现的下标
print(s.rfind('ab')) #rfind从尾巴开始找
try:
s.index('afb') #找不到'afb',因此产生异常
except Exception as e:
print(e)
s = '1234abc567abc12'
print(s.index('ab',5)) #find函数还可以指定查找位置
replace替换
s = "1234abd567abc12" b = s.replace('abc','ABC') print(b)
元组
一个元组由数个逗号分隔的值组成,前后可加括号
元组不能修改、不可增删、不可对元素赋值、不可修改元素顺序
t = 1234,54321,'hello' print(t[0]) print(t) u = t,1 print(u) print(u[0][1]) t[0][0]=8888
第六章 列表
列表可以增删元素、元素可以修改、元素可以是任何类型
对列表来说,a+=b和a=a+b不同
列表的每个元素都是指针
列表的切片返回新的列表
列表的排序:
# a.sort()可以对列表a从小到大排序 # sorted(a)返回a经过从小到大排序后的新列表,a不变 a = [5,7,6,3,4,1,2] a.sort() print(a) a = [5,7,6,3,4,1,2] b = sorted(a) print(a,'\n',b) a.sort(reverse=True) print(a)
#列表相关函数 ''' append() 添加元素x到尾部 exten() 添加列表x中的元素到尾部 insert(i,x) 将元素x插入到下标i处 remove(x) 删除元素x reverse() 颠倒整个列表 index() 查找元素x,找到则返回第一次出现的下标,找不到则引发异常 map(function,sequence),可用于将一个序列(列表、元组、集合...)映射到另一个序列 返回一个延时求值对象,可以转换成list、tuple、set... filter(function,sequence),抽取序列中令function(x)为True的元素x 返回一个延时求值对象,可以转换成list、tuple、set... ''' ''' def f(x): print(x,end="") return x*x a = map(f,[1,2,3]) print(tuple(a)) ''' def f(x): return x % 2 == 0 lst = tuple(filter(f,[1,2,3,4,5])) print(lst)
列表的拷贝和转换:
a = [1,2,3,4] b = a[:] print(b) #不能深拷贝 #进行深拷贝 import copy a = [1,[2]] b = copy.deepcopy(a) b.append(4) print(b) a[1].append(3) print(a) print(b)
元组、列表和字符串互转:
print(list("hello")) print("".join(['a','44','c'])) print(tuple("hello")) print("".join(('a','44','c')))
第七章 字典和集合
scope = {} scope['a'] = 3 scope['b'] = 4 print(scope) print('b' in scope) scope['k'] = scope.get('k',0) + 1 print(scope['k']) scope['k'] = scope.get('k',0) + 1 print(scope['k'])
字典的构造:
items = [('name','Gumby'),('age',42)] d = dict(items) print(d) d = dict(name='Gumby',age=42,height=1.76) print(d)
字典相关函数:
''' clear() 清空字典 keys() 取字典的键的序列 items() 取字典的元素的序列,可用于遍历 values() 取字典的值的序列 pop() 删除键为x的元素,如果不存在,产生异常 copy() 浅拷贝 上述序列,不是list、tuple或set ''' d = {'name':'Gumby','age':42,'GPA':3.5} if 'age' in d.keys(): print(d['age']) for x in d.items(): print(x,end=',')
集合:
print(set([])) a = {1,2,2,"ok",(1,3)} #集合的元素顺序不定 print(a) ''' add(x) 添加元素x,如果已经存在,则不添加 clear() 清空集合 copy() 返回自身的浅拷贝 remove(x) 删除x,若无,则异常 update(x) 将序列x中的元素加入集合 | & - 并、交、差 a^b 对称差 (a|b)-(a&b) a <= b a是否是b的子集 a < b a是否是b的真子集 '''
第八章 文件读写、文件夹操作和数据库
''' open函数打开文件,将返回值放入一个变量,例如f 用f.write()函数写入文件 用f.readlines()函数读取全部文件内容 用f.readline()函数读取文件一行 用f.close()函数关闭文件 用f.read()读取文件全部内容,返回一个字符串 ''' # 创建文件并写入内容 a = open("D:\\code\\pythonl2\\t.txt",'w') # 用'w'写文件,若文件本来就存在就会被覆盖 a.write('good\n') a.write('好啊\n') a.close()
readlines读:
f = open('D:\\code\\pythonl2\\t.txt','r') lines = f.readlines() #每一行都带结尾的换行符 "\n" f.close() for x in lines: print(x,end="")
readline读:
try:
infile = open('D:\\code\\pythonl2\\t.txt', 'r')
while True:
data1 = infile.readline() # data1带结尾的换行符"\n",空行也有换行符
if data1 == "": # 此条件满足代表文件结束
break
data1 = data1.strip() # 去掉两头空格,包括结尾的"\n"
print(data1)
infile.close()
except Exception as e:
print(e)
文件路径:
#获取当前文件夹 import os print(os.getcwd()) #改变当前文件夹 os.chdir("D:/program") print(os.getcwd())
文件夹操作函数:
''' os.chdir(x) 将当前的文件夹设置成x os.getcwd() 求程序的当前文件夹 os.listdir(x) 返回一个列表,里面是文件夹x中的所有文件和子文件夹的名字 os.mkdir(x) 创建文件夹 os.path.getsize(x) 获取文件夹x的大小(字节) os.path.isfile(x) 判断x是不是文件 os.remove(x) 删除文件x os.rmdir(x) 删除空文件夹x os.rename(x,y) 将文件或文件夹x改名为y,还可以移动文件或文件夹 shutil.copyfile(x,y) 拷贝文件x到y,若y本来就存在,会被覆盖 '''
命令行参数:
统计单个文件单词频率:
import sys import re def countFile(filename,words): #对filename文件进行词频分析,分析结果记在词典wrods里 try: f = open(filename,"r",encoding="gbk") except Exception as e: print(e) return 0 txt = f.read() f.close() splitChars = set([]) for c in txt: if not (c >= 'a' and c <='z' or c >= 'A' and c<= 'Z'): splitChars.add(c) splitsStr = "" for c in splitChars: if c in ['.','?','!','"',"'",'(',')','|','*','$','\\','[',']','^','{','}']: splitsStr += "\\"+c+"|" else: splitsStr += c +"|" splitsStr += " " lst = re.split(splitsStr,txt) for x in lst: if x == "": continue lx = x.lower() if lx in words: words[lx] += 1 else: words[lx] = 1 return 1 result = {} if countFile(sys.argv[1],result) == 0: exit() lst = list(result.items()) lst.sort() f = open(sys.argv[2],"w") for x in lst: f.write("%s\t%d\n"%(x[0],x[1])) f.close()
统计多个文件累计单词频率:
import sys import re import os def countFile(filename,words): #对filename文件进行词频分析,分析结果记在词典wrods里 try: f = open(filename,"r",encoding="gbk") except Exception as e: print(e) return 0 txt = f.read() f.close() splitChars = set([]) for c in txt: if not (c >= 'a' and c <='z' or c >= 'A' and c<= 'Z'): splitChars.add(c) splitsStr = "" for c in splitChars: if c in ['.','?','!','"',"'",'(',')','|','*','$','\\','[',']','^','{','}']: splitsStr += "\\"+c+"|" else: splitsStr += c +"|" splitsStr += " " lst = re.split(splitsStr,txt) for x in lst: if x == "": continue lx = x.lower() if lx in words: words[lx] += 1 else: words[lx] = 1 return 1 result = {} lst = os.listdir() for x in lst: if os.path.isfile(x): if x.lower().endswith(".txt"): countFile(x,result) lst = list(result.items()) lst.sort(key= lambda x:(-x[1],x[0])) f = open(sys.argv[1],"w") for x in lst: f.write("%s\t%d\n" % (x[0],x[1])) f.close()