python中len(string.digits)_python之random模块

一、模块简介

python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。

二、random模块重要函数

1 )、random() 返回0<=n<1之间的随机实数n;

2 )、choice(seq) 从序列seq中返回随机的元素;

3 )、getrandbits(n) 以长整型形式返回n个随机位;

4 )、shuffle(seq[, random]) 原地指定seq序列;

5 )、sample(seq, n) 从序列seq中选择n个随机且独立的元素;

三、random模块方法说明

random.random()函数是这个模块中最常用的方法了,它会生成一个随机的浮点数,范围是在0.0~1.0之间。

random.uniform()正好弥补了上面函数的不足,它可以设定浮点数的范围,一个是上限,一个是下限。

random.randint()随机生一个整数int类型,可以指定这个整数的范围,同样有上限和下限值,包含上限和下限。

random.randrange()随机生成一个整数int类型,可以指定这个整数的范围,同样有上限和下限值,包含上限,不包含下限。

random.choice()可以从任何序列,比如list列表中,选取一个随机的元素返回,可以用于字符串、列表、元组等。

random.shuffle()如果你想将一个序列中的元素,随机打乱的话可以用这个函数方法。

random.sample()可以从指定的序列中,随机的截取指定长度的片断,不作原地修改。

四、random模块教程总结

Python中任何与随机相关的问题,都可以首先考虑random模块,熟悉掌握其中的常用方法,是一个对程序员的最基本要求。

五、需求实例

需求:需要造100个,长度为255字节的随机数字(含大写字母,小写字母和数字)。这个时候使用random模块的sample函数+string模块的digits,digits属性可以很好的满足需求:

>>> import random

>>> random.sample('abcd', 2)

['a', 'd']

比如上面,从abcd四个字符随机取出2个,就可以看到,第一个参数是一个序列,第二个参数是取的随机数个数,当前其大小要小于len(aList).然后再结合string模块:

>>> import string

>>> string.ascii_letters

'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

>>> string.digits

'0123456789'

注:以上是python3中调用string模块的属性,python2中查找大小写的属性是strig.letters,如果想查看更多的方法直接使用帮助文档string(help)

果要凑齐255个字符,则可以这样。

>>> string.ascii_letters * 4 + string.digits * 5

'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890123456789012345678901234567890123456789'

>>> len(string.ascii_letters * 4 + string.digits * 5)

258

所以用一个脚本来生成就是:

#Author:qinjaixi

import random

import string

file_data = open('test.txt', 'w')

for i in range(100):

data = ''.join(random.sample(string.digits * 5 + string.ascii_letters * 4, 255))

file_data.write(data + '\n')

file_data.close()

这样在文件test.txt文件里面就有100条,长度为255字节的随机字符

需求实例:实现四个随机字符验证码

1 #!/usr/bin/env python

2 #-*- coding:utf-8 -*-

3 #Author:qinjiaxi

4 importrandom5 check_code = ''

6 for i in range(4):7 current = random.randrange(0,4)8 #字母

9 if current ==i:10 tmp = chr(random.randint(65,90))11 #数字

12 else:13 tmp = random.randint(0,9)14 check_code +=str(tmp)15 print(check_code)

另外谈一谈python中的join()方法:

python中经常会用到join()方法,借这个机会浅谈一下。

描述

Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

语法

str.join(sequence)

其中sequence就是一个序列--->在python中序列是指字符串、列表、字典、元组

返回值

返回的就是通过str(指定的符号)连接的一个新字符串

实例

>>> str = '-'

>>> str.join('ABC')

'A-B-C'

记忆小方法

str.join(元组、列表、字典、字符串)生成的只能是字符串,所以很多地方很多时候把数据类型转换成字符串可以用join方法。

1.列表:

>>> list = ['1', '2', '3']

>>> ''.join(list)

'123'

错误示例:

>>> list = [1,2,3,4]

>>> ''.join(list)

Traceback (most recent call last):

File "", line 1, in

''.join(list)

TypeError: sequence item 0: expected str instance, int found

错误原因:类型错误,列表的元素必须是字符串

2.字典

>>> seq = {'hi':'nihao', 'age':'nianling', 'boy':'young'}

>>> '-'.join(seq)

'age-boy-hi'

可以看到在字典中是使用join方法是直接把key连接起来

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了修复这个程序的漏洞,可以加入一个时间限制,如果用户输入的参数过大导致程序运行时间过长,程序会自动退出。代码如下所示: ```python from Crypto.Util.number import * from Crypto.PublicKey import RSA from hashlib import sha256 import random, os, signal, string def proof_of_work(): random.seed(os.urandom(8)) proof = ''.join([random.choice(string.ascii_letters+string.digits) for _ in range(20)]) _hexdigest = sha256(proof.encode()).hexdigest() print(f"sha256(XXXX+{proof[4:]}) == {_hexdigest}") print('Give me XXXX: ') x = input() if len(x) != 4 or sha256(x.encode()+proof[4:].encode()).hexdigest() != _hexdigest: print('Wrong PoW') return False return True if not proof_of_work(): exit(1) signal.alarm(10) print("Give me a bad RSA keypair.") try: p = int(input('p = ')) q = int(input('q = ')) assert p > 0 assert q > 0 assert p != q assert p.bit_length() == 512 assert q.bit_length() == 512 assert isPrime(p) assert isPrime(q) n = p * q e = 65537 assert p % e != 1 assert q % e != 1 d = inverse(e, (p-1)*(q-1)) key = RSA.construct([n,e,d,p,q]) print("This is not a bad RSA keypair.") exit(3) except AssertionError: print("Invalid params") exit(2) except KeyboardInterrupt: print("Time limit exceeded") exit(4) except ValueError: print("How could this happen?") from secret import flag print(flag) ``` 在新代码,我们使用了 signal 库的 alarm 函数,将程序的运行时间限制在 10 秒钟内。当用户输入的参数过大导致程序运行时间超过 10 秒时,程序会自动退出,并输出 "Time limit exceeded"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值