Python编写随机密码生成器输出末尾出现多余%符号问题求助
问题描述
我是Python初学者,目前正在开发一款基础随机密码生成器:程序接收用户输入的整数作为目标密码长度,随后输出对应长度的随机字符串。例如用户输入长度8时,程序本应返回由8个随机字符组成的密码。
目前遇到异常:程序生成的随机字符末尾总会额外追加一个%符号,初步猜测可能是当前使用的Zsh shell提示符自动追加导致,但无法确认具体原因。当前运行环境为Fedora 36操作系统,使用Z shell(Zsh),需要明确问题产生原因,以及调整输出格式移除该多余符号的方法。
问题相关代码
import random import string print('How many characters would you like your password to be?:') passwd_length = int(input()) random_chars = (string.ascii_letters + string.digits + string.punctuation) for i in range(0,passwd_length): i = random.choice(random_chars) print(i,end = '')
异常运行示例
- 输入密码长度8时,实际输出:
:/VG#DYQ%
- 输入密码长度10时,实际输出:
Hqo64w"H"l%
问题原因
末尾的%和Python代码逻辑无关,是Zsh的内置提示行为:当前台运行的程序输出内容的最后一行没有以换行符\n结尾时,Zsh会自动在该行末尾追加%标记,再换行显示命令提示符,作用是明确区分程序输出和shell提示符,避免两者挤在同一行无法分辨。
原代码循环打印密码字符时统一设置了end='',打印完所有密码字符后没有输出收尾的换行符,刚好触发了Zsh的这个提示规则,才会看到密码末尾多了%。数一下%前面的字符长度,刚好等于输入的密码长度,也能印证这个符号不是程序生成的。
解决方法
只需要在所有密码字符打印完成后,额外输出一个换行符即可。最简单的实现是在循环结束后加一行空的print()——Python的print()函数默认会在内容末尾追加换行符,刚好补上缺失的收尾换行。
修改后的可运行代码:
import random import string print('How many characters would you like your password to be?:') passwd_length = int(input()) random_chars = string.ascii_letters + string.digits + string.punctuation for _ in range(passwd_length): char = random.choice(random_chars) print(char, end='') # 补收尾换行,避免Zsh追加%标记 print()
小优化:原代码循环内复用了循环变量
i存储随机字符,可读性较差,改用无意义循环变量_加独立的char变量存储随机字符,代码逻辑更清晰。
修改后运行,程序输出完密码会自动换行,Zsh就不会再追加多余的%符号。
内容的提问来源于stack exchange,提问作者ChefBoyRD

