题目:
该函数的功能是随机生成一串字符串,其中:字符串的长度可接收指定值,如无指定则默认为 128;字符串完全随机,且仅包含数字和大小写英文字母。 请随意指定一个长度值,并调用该函数。
分析:
- 如何表示 “数字和大小写英文字母” 这一堆字符?
- 如何从这一堆字符中随机抽取 1 个字符?
- 如何执行 n 次随机,拼成一个字符串?
代码实现
def random_string(k=128):
import random
from string import ascii_letters,digits
char = digits + ascii_letters
rlt = "".join(random.choices(char,k=k))
return rlt
random_string(k=20)
1. 如何表示 “数字和大小写英文字母” 这一堆字符?
1.1 手敲或拷贝粘贴
萌新的第一个冲动,是完全手敲出来。稍微具备了 “编程能减少人类的重复工作量” 这种思维的人,可能会去搜索并拷贝粘贴这一串字符 —— 由此减少自己手敲的工作量。
—— 不用因此害羞,萌新是每个人曾经的过去,大家都是从萌新一步一步走过来的。
char = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
1.2 字符串常量
Python提供了字符串常量,点击阅读 Python 官方文档 “string —— 常见的字符串”。
string.ascii_letters 下文所述 ascii_lowercase 和 ascii_uppercase 常量的拼连。
string.ascii_lowercase 小写字母 'abcdefghijklmnopqrstuvwxyz'。
string.ascii_uppercase 大写字母 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。
string.digits 字符串 '0123456789'。
这是相当简便的方式。
from string import ascii._letters,digits
char = ascii_letters + digits
两个字符串直接采用 + 可以合并为一个新的字符串。当然也可以使用 join() 方法来拼接字符串。
from string import ascii_letters,digits
char = "".join([diits,ascii_letters])
1.3 ASCII码值
还有同学对 ASCII 码更钟情,并硬生生记住了码值。好处也很显然,任何编程语言,该码值都通用,无需记忆不同编程语言所提供的字符串常量。
数字 0-9 分别对应码值 从 48 开始共 10 个
大写字母 A-Z 分别对应码值 从 65 开始共 26 个
小写字母 a-z 分别对应码值 从 97 开始从 26 个
charx = [chr(i) for i in range(48,123)
if (i>=48 and i < 48+10)
or (i>=65 and i < 65+26)
or (i>=97 and i < 97+26)]
char = "".join(charx)
甚至…… 连码值也不用记。直接用 ord()
去获取数字 0、字母 A 和 a 的码值,然后再分别加上 10、26、26 —— 数字有 10 个,英文字母有 26 个,它们在 ASCII 码表中是顺序排列的。
charx = [chr(i) for i in range(0,128)
if (i>=ord("0") and i<ord("0")+10)
or (i>=ord("A") and i<ord("A")+26)
or (i>=ord("a") and i<ord("a")+26)]
char = "".join(charx)
2. 如何从一堆字符中随机抽取 1 个字符?
2.1 randint
与randrange
import random
n = len(char)
i = random.randrange(0,n)
char[i]
查看randint
和randrange
的官方文档
import random
random.randrange?
random.randint?
randint(a,b)
包含右侧端点 b;而randrange(a,b)
不包含右侧端点 b。
2.2 对非空序列随机的方法
random模块其实带有2个对非空序列元素随机的方法。
random.choice(seq):从非空序列seq返回一个随机元素
random.choices(popilation, weights=None,*,cum_weights=None, k=1)
从population中选择替换,返回大小为k的元素列表
import random
random.choice(char)
random.choices(char,k=12)
3. 如何执行n次随机,拼成一个字符串?
除了random.choices()
方法能一步到位外,其它方法可以采用列表构造表达式,或 for 循环。
import random
k = 24
# 列表生成式
rltx = [char[random.randrange(0,len(char))] for i in range(k)]
"".join(rltx)
import random
k = 24
rlt = ""
# for循环
for i in range(k):
rlt += char[random.randrange(0,len(char))]
rlt
字符串的 join() 方法非常好用,random 的几个常用方法也很强大,花点时间多练习,强烈建议大家掌握。
str.join?
join(self, iterable, /)
Concatenate any number of strings.
The string whose method is called is inserted in between each given string.
The result is returned as a new string.
Example: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'
参考链接:https://xue.cn/hub/reader?bookId=1&path=the-craft-of-selfteaching/notes_13.ipynb