Loading

习题练习:函数随机生成字符串

题目:

该函数的功能是随机生成一串字符串,其中:字符串的长度可接收指定值,如无指定则默认为 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 randintrandrange
import random
n = len(char)
i = random.randrange(0,n)
char[i]

查看randintrandrange的官方文档

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

posted @ 2021-05-05 18:39  紫曜花  阅读(255)  评论(0编辑  收藏  举报