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


    题目:

    该函数的功能是随机生成一串字符串,其中:字符串的长度可接收指定值,如无指定则默认为 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

  • 相关阅读:
    How to Use .Net Remoting Using C#
    How to: Build a Client Application
    C# 禁用鼠标中间键
    秒杀系统:设计方案与实现思路
    JDBC连接数据库
    Java调用webService示例
    spring MVC
    rust贪吃蛇
    初识智遥工作流软件——表单开发篇2
    初识智遥工作流软件——表单开发篇1
  • 原文地址:https://www.cnblogs.com/augustine0654/p/14732374.html
Copyright © 2020-2023  润新知