鱼C论坛

 找回密码
 立即注册
查看: 1452|回复: 9

[已解决]20课动动手第1题

[复制链接]
发表于 2020-8-31 15:42:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我写的代码是:
def a():
    text = input('请输入文本:')
    if '\n' in text:
        text_new = text.replace('\n','1')
    symbols = r'~!@#$%^&*()_+{}|:"<>?`-=[]\;,./'
    length = len(symbols)
    for i in range(length):
        b = text_new.count(symbols[i])
        print(symbols[i],'有',b,'个')
运行以后出错了,错误是
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    a()
  File "C:/Users/ciic/Desktop/111.py", line 8, in a
    b = text_new.count(symbols[i])
UnboundLocalError: local variable 'text_new' referenced before assignment

这里没看明白错误提示,两个疑问:1.我只有一个函数,为什么会提示local variable?2.我已经定义过text_new了,为什么说没有定义?
最佳答案
2020-8-31 15:49:01
def a():
    text = input('请输入文本:')

    text_new = text.replace('\n','1')
    symbols = r'~!@#$%^&*()_+{}|:"<>?`-=[]\;,./'
    length = len(symbols)
    for i in range(length):
        b = text_new.count(symbols[i])
        print(symbols[i],'有',b,'个')
a()
因为input默认返回的是换行符之前的字符,if判断之后才定义text_new,不用判断换行符的存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-31 15:49:01 | 显示全部楼层    本楼为最佳答案   
def a():
    text = input('请输入文本:')

    text_new = text.replace('\n','1')
    symbols = r'~!@#$%^&*()_+{}|:"<>?`-=[]\;,./'
    length = len(symbols)
    for i in range(length):
        b = text_new.count(symbols[i])
        print(symbols[i],'有',b,'个')
a()
因为input默认返回的是换行符之前的字符,if判断之后才定义text_new,不用判断换行符的存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 15:51:17 | 显示全部楼层
1q23w31 发表于 2020-8-31 15:49
因为input默认返回的是换行符之前的字符,if判断之后才定义text_new,不用判断换行符的存在

能再解释一下吗?还是不太清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 16:14:28 | 显示全部楼层
pejayang 发表于 2020-8-31 15:51
能再解释一下吗?还是不太清楚

https://fishc.com.cn/forum.php?m ... amp;highlight=input
看一下input的用法,末尾的换行符会被丢弃,所以text里面没有换行符,也就不需要判断是否存在且替换
所以会说你的text_new没定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 16:33:42 | 显示全部楼层
def a():
    text_new = input('请输入文本:')
    symbols = r'~!@#$%^&*()_+{}|:"<>?`-=[]\;,./'
    length = len(symbols)
    for i in range(length):
        b = text_new.count(symbols[i])
        print(symbols[i],'有',b,'个')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 18:45:33 | 显示全部楼层
input获得的字符串是不可能含有'\n'的,因此第三行的if语句判断为假,所以没有定义变量 text_new,所以在第8行的时候使用 text_new 就出错了
直接把第3 、4行删掉,然后把第8行的的text_new改为text就可以了
def a():
    text = input('请输入文本:')
    symbols = r'~!@#$%^&*()_+{}|:"<>?`-=[]\;,./'
    length = len(symbols)
    for i in range(length):
        b = text.count(symbols[i])
        print(symbols[i],'有',b,'个')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 19:52:56 | 显示全部楼层
没有考虑没替换字符的情况,这时候就没定义text_new
def a():
    text = input('请输入文本:')
    if 'someString' in text:
        text = text.replace('someString','1')
    symbols = r'~!@#$%^&*()_+{}|:"<>?`-=[]\;,./'
    length = len(symbols)
    for i in range(length):
        b = text.count(symbols[i])
        print(symbols[i],'有',b,'个')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-1 08:55:33 | 显示全部楼层
sunrise085 发表于 2020-8-31 18:45
input获得的字符串是不可能含有'\n'的,因此第三行的if语句判断为假,所以没有定义变量 text_new,所以在第 ...

我一开始是这样写的代码,运行以后发现代码只会统计第一段字符串里,结果是这样的:
~ 有 0 个
! 有 5 个
@ 有 8 个
# 有 3 个
$ 有 6 个
% 有 7 个
^ 有 6 个
& 有 4 个
* 有 4 个
( 有 2 个
) 有 4 个
_ 有 10 个
+ 有 4 个
{ 有 3 个
} 有 6 个
| 有 0 个
: 有 0 个
" 有 0 个
< 有 0 个
> 有 0 个
? 有 0 个
` 有 0 个
- 有 0 个
= 有 0 个
[ 有 4 个
] 有 4 个
\ 有 0 个
; 有 0 个
, 有 0 个
. 有 0 个
/ 有 0 个

所以我才加入了判断折行的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-1 10:42:40 | 显示全部楼层
pejayang 发表于 2020-9-1 08:55
我一开始是这样写的代码,运行以后发现代码只会统计第一段字符串里,结果是这样的:

什么叫只会统计第一段字符串?
你程序中用的是input进行字符串输入,那么你输入一串字符之后敲回车就结束输入了。什么叫第一段字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-1 14:50:31 | 显示全部楼层
那我该怎么用这段代码统计所有文本中出现的符号数量呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 20:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表