鱼C-小师妹 发表于 2022-1-7 21:11:29

25 - 名字生成器

本帖最后由 不二如是 于 2022-7-6 19:15 编辑

https://www.bilibili.com/video/BV1HT4y1K7DY?p=28

这次我们动手编写一个把姓氏和名字随机组合来产生虚假姓名的程序。

下次当我们再纠结该起什么网名时,就可以这个程序来自动生成~

程序默认一旦启动后按下“回车”键就自动生成,按下“q”键才能退出程序。

第一步毫无疑问,我们要先定义两张表用来存放名字和姓氏。

列表和元祖都可以,但是考虑到我们创建表的稳定性,不能想被修改就被修改。

我们就采用元组,它与列表类似,不同之处在于元组的元素不能修改。

由于这两张长度不会太长,如果姓氏有 20 个,名字有 20 个,就可以生成 20 * 20 共计 400 个随机组合名字哦。

哪怕就是各有 100 个,两张表加起来不过几kb大小,不会占用大量内存,并且不需要动态更新。

所以我们直接在程序中创建就好,当程序运行后,会根据这两个元组中的内容,匹配姓氏和名字,生成一个新的姓名组合。

用户可以重复该过程,直到产生足够多的名字为止。

为了突出显示结果,使它与命令提示信息有明显的不同。

IDLE 提供的可用字体选项并不多,学到这一讲的读者,应该遇到过错误信息会被标红的情况啦。



在解释器窗口中,默认的标准输出函数是 print()。

但当加载 sys 模块后,可以使用 file 参数将输出重定向到错误信息输出通道,使输出的文字颜色为红色:

print(内容, file=sys.stderr).
我们就利用该方法将生成结果高亮。

因为数据量不大,我们直接将姓氏和名字分别写入两个元组中:

first = ('张','赵','李','孙','王','刘','上官','欧阳','李','袁','钱','慕容','余','肖','杜','关','马','曹','潘','周')
    second=('福谛','锦震','祥骏','琛铭','天栋','潍睿','炳年','龙卓','华梁','郁谷','贤康','帝华','锐伟','海潍','锋海','锟帆','骏逸','凡弘','梁帆','锦初')
数据都是我们随机生成的,如果数据量几百条,为了不影响代码阅读,我们需要将数据保存在脚本外。

接下来我们就通过 random 模块中的 choice 方法从两个元组中产生数据:

   first_name = random.choice(first)
      second_name = random.choice(second)
因为我们要求默认回车持续生成,只有按 q 键才能退出游戏,所以就需要一个 while 循环持续生成随机名字:

while True:
      first_name = random.choice(first)
      second_name = random.choice(second)
        print("{}{}".format(first_name,second_name),file=sys.stderr)
我们通过 input 语句获取用户的输入。

如果用户选择“重新开始”,那就重复上述生成名字的过程。

如果输入 q 就结束并退出:

try_again = input("\n\n再来?(回车继续,q退出)")
      if try_again.lower() == "q":
            break
游戏主体就有了,我们将上面的操作封装到函数 myGame 中:

def myGame():
    print("欢迎来到鱼C名字生成器\n")
    first = ('张','赵','李','孙','王','刘','上官','欧阳','李','袁','钱','慕容','余','肖','杜','关','马','曹','潘','周')
    second=('福谛','锦震','祥骏','琛铭','天栋','潍睿','炳年','龙卓','华梁','郁谷','贤康','帝华','锐伟','海潍','锋海','锟帆','骏逸','凡弘','梁帆','锦初')
    while True:
      first_name = random.choice(first)
      second_name = random.choice(second)
      print("{}{}".format(first_name,second_name),file=sys.stderr)
      try_again = input("\n\n再来?(回车继续,q退出)")
      if try_again.lower() == "q":
            break
运行看下结果:



简单几行代码就实现了我们上面说的游戏,是不是很厉害呢!

源码:

通过 while 循环可以实现很多文字判断类游戏,例如我们让计算机在 1 - 100 间产生一个随机数:

random.randint(1,100)

我们来猜,比随机数小就提示小了,大了,就提示大了,让用户重新输入:

if guess > result:
      print("大了,大了")
    else:
      print("小了,小了")

直到猜对才能结束并提示:“好棒哦,这都能被你猜到!”



猜对部分和 while 部分留给你们当课后作业,下课~

答案:







极行空间 发表于 2022-1-7 21:25:09

学习

xiaosi4081 发表于 2022-1-9 10:04:38

来来来,看看{:10_256:}

junkersykj 发表于 2022-1-18 16:48:55

{:10_254:}{:10_254:}{:10_254:}

hornwong 发表于 2022-1-18 18:22:36

{:5_95:}

Hyjxsssss 发表于 2022-5-14 15:43:56

# 题干
# 编写一个把姓氏和名字随机组合来产生虚假姓名的程序

def Namegenerator():
    given_name = ('赵','钱','孙','李','陈','董')
    first_name = ('发财', '富贵', '有钱', '帅气', '滑板鞋', '便利店')

    import random as r

    length1 = len(first_name) - 1
    length2 = len(given_name) - 1

    first_namerandom = r.choice(first_name)
    given_namerandom = r.choice(given_name)

    print('欢迎来到名字生成器')
    print(given_namerandom+first_namerandom)

    while True:
      temp = input('再来?(回车继续,按q退出)')
      first_namerandom = r.choice(first_name)
      given_namerandom = r.choice(given_name)
      if temp == 'q':
            break
      else:
            print(f'{given_namerandom}{first_namerandom}')

Namegenerator()



# 猜数字游戏
def Guessnumber():
    import random as r

    ans = r.randint(1, 10)
    guess = int(input('猜一下我心里想的是什么数:'))
    limit = 1
    while True:
      if limit < 5:
            if guess == ans:
                print('好棒哦,这都能被你猜到!')
                break
            elif guess < ans:
                print('小了,小了')
            else:
                print('大了,大了')
            limit += 1
            guess = int(input('没猜对,继续:'))
      else:
            print('5次机会已经用完!')
            break

Guessnumber()
页: [1]
查看完整版本: 25 - 名字生成器