实验1:基础
**分支结构:**if……elif……elif……else……
**循环结构:**while;for……
其中循环中利用in,not in等关键字可以遍历列表(list),字典等数据结构
利用range(0,n)可以生成一系列数字1~n-1
数据类型:
数字,布尔型,字符串等
用到的高级数据类型:
列表:插入元素,删除元素
.append(参数)
.pop(参数)
.insert(参数1,参数2)
字符串操作的方法:
.isdigit()
.isupper()
.islower()
.upper()
.lower()
实验2:Hangman游戏设计
无
实验3:Tic Tac Toe(井字棋)游戏设计
一、\t转义字符 平常用得比较少,这次在画棋盘上很有用
二、random在Python中的使用方法
1.random.random()
随机生成0-1之间的小数
2.random.uniform(min,max)
随机生成min-max之间的小数
3.random.randint(min,max)
同2,but min>max会报错
4.random.choice(元组/列表/range()/字符串)
三.theBoard = [’ '] *10 极速生成一个list
四.同时得到两个参数
if letter is ‘X’, return [‘X’,‘O’]
else return [‘O’,‘X’]
实验4:DNA翻译
默认的文件路径为相对路径,虽然放在了一个文件夹,但依然打不开= =于是我将他改成了绝对路径;我的文件绝对路径是C:\Users\86133\Desktop\dna.txt
SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape
查阅资料后发现:在windows系统当中读取文件路径可以使用,但是在python字符串中\有转义的含义,所以我们需要采取一些方式使得\不被解读为转义字符
解决方法中选择了第二种
1在路径前面加r,即保持字符原始值的意思
2替换为双反斜杠
3替换为正斜杠
学到的一些知识点:
1 .replace方法
str.replace(old, new[, max])
(max为替换不超过max次,replace不会改变原string的内容)
2.文件的打开与关闭 f = open(‘a.txt’,‘wt’)
a.close() 文件名.close()
实验5:凯撒密码
一.创建空字典
dic = {}
二.创建非空字典
1.
Dic = {
'name':'naruto',
'age':18,
}
2.
dic = {
1 : 'One',
2 : 'Two',
}
3.
dic = {
'YAZHOU':['中国','日本','韩国','伊朗'],
'OUZHOU':['英国','法国','德国'],
'MEIZHOU':['美国','加拿大','墨西哥']
}
4.
dic = {
(1970,1,1) : "test year"
}
修改:字典[键] = 值
删除:del 字典[键]
通过 字典.keys() 得到所有的键组成的列表
通过 字典.values() 得到所有的值组成的列表
通过 字典.items() 得到所有的键值对所组成的列表
实验6:加解密文本文件
按照二进制数异或的原理,对文本文件进行加解密。
1.加密操作
首先将文本文件转换为二进制数,再生成与该二进制数等长的随机密钥,将二进制数与密钥进行异或操作,得到加密后的二进制数。
2.解密操作
将加密后的二进制文件与密钥进行异或操作,得到原来的二进制数,再将二进制数恢复成文本文件。
①散列加密
import hashlib
a='password'.encode('utf-8')
print('blake2b:',hashlib.blake2b(a).hexdigest())
print('blake2s:',hashlib.blake2s(a).hexdigest())
print('md5:',hashlib.md5(a).hexdigest())
print('sha1:',hashlib.sha1(a).hexdigest())
print('sha224:',hashlib.sha224(a).hexdigest())
print('sha256:',hashlib.sha256(a).hexdigest())
print('sha384:',hashlib.sha384(a).hexdigest())
print('sha3_224:',hashlib.sha3_224(a).hexdigest())
print('sha3_256:',hashlib.sha3_256(a).hexdigest())
print('sha3_384:',hashlib.sha3_384(a).hexdigest())
print('sha3_512:',hashlib.sha3_512(a).hexdigest())
print('sha512:',hashlib.sha512(a).hexdigest())
②python函数引用多个参数
*表示可以接受多个参数,并放入一个元组中
**函数接受参数后,返回字段
③secret库的token_bytes 适合生成随机密钥
④.Encode()方法
str.encode(encoding=‘UTF-8’,errors=‘strict’)
encoding – 要使用的编码,如"UTF-8"。Base64
errors – 设置不同错误的处理方案。默认为 ‘strict’,意为编码错误引起一个UnicodeError。 其他可能得值有 ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ 以及通过 codecs.register_error() 注册的任何值。
用于返回编码后的字符串
对应decode方法,用于解码
实验7:暴力破解MD5值
MD5算法原理:MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value)MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
Itertools 迭代器模块->高效率的循环
1.无限迭代的迭代器:
Count,islice,cycle, repeat
2.可终止迭代器
Accumulate(可迭代对象[,函数])chain(*可迭代对象)
Groupby()把迭代器中相邻的重复元素挑出来放在一起
实验8:模拟蒙特·卡罗法计算圆周率近似值
蒙特·卡罗方法又称统计实验法,是一种通过概率来得到问题近似解的方法,在很多领域都有重要的应用,其中包括圆周率近似值的计算问题。假设有一块边长为2的正方形模板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x,y)必然在模板上(更多时候是落在单位圆内)。如果扔的次数足够多,那么落在单位圆内的次数除以总次数再乘以4,这个数字会无限逼近圆周率的值。这就是蒙特·卡罗发明的用于计算圆周率近似值的方法。
程序实现
import random
sum1=0
count=0
while sum1<=1000000000:
x = random.uniform(-1,1)
y = random.uniform(-1,1)
if x*x+y*y<=1:
count+=1
sum1+=1
pai=count*4.0/sum1
print(pai)
一、基本随机函数
seed(a=None)
初始化给定的随机数种子,默认为当前系统时间
random.seed(10) #产生种子10对应的序列
random()
生成一个[0.0,1.0)之间的随机小数
random.random()
0.5714025946899135 #随机数产生与种子有关
二、扩展随机数函数
函数 描述
randint(a,b) 生成一个[a,b]之间的整数
random.randint(10,100)
randrange(m,n[,k]) 生成一个[m,n)之间以k为步长的随机整数
random.randrange(10,100,10)
getrandbits(k) 生成一个k比特长的随机整数
random.getrandbits(16)
37885
uniform(a,b) 生成一个[a,b]之间的随机小数
random.uniform(10,100)
16.848041210321334
choice(seq)
序列相关 从序列中随机选择一个元素
random.choice([1, 2, 3, 4, 5, 6, 7, 8, 9])
8
shuffle(seq)
序列相关 将序列seq中元素随机排列,返回打乱后的序列
s=[1, 2, 3, 4, 5, 6, 7, 8, 9];
random.shuffle(s);
print(s)
[9, 4, 6, 3, 5, 2, 8, 7, 1]
Python列表脚本操作符
列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。
如下所示:
Python 表达式 | 结果 | 描述 |
---|---|---|
len([1, 2, 3]) | 3 | 长度 |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 组合 |
[‘Hi!’] * 4 | [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] | 重复 |
3 in [1, 2, 3] | True | 元素是否存在于列表中 |
for x in [1, 2, 3]: print(x, end=" ") | 1 2 3 | 迭代 |
Python在函数中使用*和**接收元组和列表
当要使函数接收元组或字典形式的参数 的时候,有一种特殊的方法,它分别使用*和*前缀 。这种方法在函数需要获取可变数量的参数*的时候特别有用。
[注意]
[1] 由于在args变量前有前缀 ,所有多余的函数参数都会作为一个元组存储在args中* 。如果使用的是****前缀** ,多余的参数则会被认为是一个字典的健/值对 。
[2] 对于def func(args):,args表示把传进来的位置参数存储在tuple(元组)args里面。例如,调用func(1, 2, 3) ,args就表示(1, 2, 3)这个元组 。
[3] 对于def func(args):,args表示把参数作为字典的健-值对存储在dict(字典)args里面。例如,调用func(a=‘I’, b=‘am’, c=‘wcdj’) ,args就表示{‘a’:‘I’, ‘b’:‘am’, ‘c’:‘wcdj’}这个字典 。
[4] 注意普通参数与和**参数公用的情况,一般将和**参数放在参数列表最后。
[元组的情形]
#! /usr/bin/python
# Filename: tuple_function.py
# 2010-7-19 wcdj
def powersum(power, *args):
'''Return the sum of each argument raised
to specified power.'''
total=0
for i in args:
total+=pow(i,power)
return total
print 'powersum(2, 3, 4)==', powersum(2, 3, 4)
print 'powersum(2, 10)==', powersum(2, 10)
########
# output
########
powersum(2, 3, 4)==25
powersum(2, 10)==100
[字典的情形]
#! /usr/bin/python
# Filename: dict_function.py
# 2010-7-19 wcdj
def findad(username, **args):
'''find address by dictionary'''
print 'Hello: ', username
for name, address in args.items():
print 'Contact %s at %s' % (name, address)
findad('wcdj', gerry='gerry@byteofpython.info', /
wcdj='wcdj@126.com', yj='yj@gmail.com'
t = (1,) # 一个元素元组的定义注意有逗号