NameError: name ‘writetxts‘ is not defined

第一次学习写Python函数,很简单,代码如下

    # name是要保存txt的路径(含文件名)
    # things是要写入的内容
    file1 = open(name,'w')
    file1.write(things)
    file1.close()
    return ""
    ```

但就不知道为什么就报了错,报错如下:

(most recent call last): File "png}textpng.py", line 48, in <module>
writetxts(sys.argv[2],text)
NameError: name 'writetxts' is not defined

意思大概是一个叫做“writetxts”的函数名称没有声明,但明明声明了啊?下面列出我解决的步骤

First

既然说没声明,就看看函数名是不是输错了,毕竟是用vim编程(还不会设置)
然后认认真真的检查,没问题啊?真奇怪

        # ......
        print(text)
    else:
        writetxts(sys.argv[2],text)
def writetxts(name,things):
    # name是要保存txt的路径(含文件名)
    # things是要写入的内容
    file1 = open(name,'w')
    file1.write(things)
    file1.close()
    return ""
# ......

Second

在我疑惑之时,突然想到了一个对我来说不可思议的答案:函数位置放错了(毕竟C#就不太注意位置),然后将代码调节如下:

# ......
import matplotlib.pyplot as plt
import sys
# 用于写入文本文档的函数
def writetxts(name,things):
    # name是要保存txt的路径(含文件名)
    # things是要写入的内容
    file1 = open(name,'w')
    file1.write(things)
    file1.close()
    return ""

show_heigth = 30
show_width = 40
# ......
        text += ascii_char[int(gray[y][x] / 256 * char_len)]
    if len(sys.argv) < 3 :
        print(text)
    else:
        writetxts(sys.argv[2],text)
# ......

就可以运行了?看来适应它还要时间

End

就这样,发一下无聊写的源码(放心,100%有bug):
修改前:

import matplotlib.pyplot as plt
import sys
show_heigth = 30
show_width = 40
#这两个数字是调出来的

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
#生成一个ascii字符列表
char_len = len(ascii_char)

pic = plt.imread(sys.argv[1])
#使用plt.imread方法来读取图像,对于彩图,返回size = heigth*width*3的图像
#matplotlib 中色彩排列是R G B
#opencv的cv2中色彩排列是B G R

pic_heigth,pic_width,_ = pic.shape
#获取图像的高、宽

gray = 0.2126 * pic[:,:,0] + 0.7152 * pic[:,:,1] + 0.0722 * pic[:,:,2]
#RGB转灰度图的公式 gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

#思路就是根据灰度值,映射到相应的ascii_char
for i in range(show_heigth):
    #根据比例映射到对应的像素
    y = int(i * pic_heigth / show_heigth)
    text = ""
    for j in range(show_width):
        x = int(j * pic_width / show_width)
        text += ascii_char[int(gray[y][x] / 256 * char_len)]
    if len(sys.argv) < 3 :
        print(text)
    else:
        writetxts(sys.argv[2],text)
def writetxts(name,things):
    # name是要保存txt的路径(含文件名)
    # things是要写入的内容
    file1 = open(name,'w')
    file1.write(things)
    file1.close()
    return ""

修改后:

import matplotlib.pyplot as plt
import sys
# 用于写入文本文档的函数
def writetxts(name,things):
    # name是要保存txt的路径(含文件名)
    # things是要写入的内容
    file1 = open(name,'w')
    file1.write(things)
    file1.close()
    return ""

show_heigth = 30
show_width = 40
#这两个数字是调出来的

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
#生成一个ascii字符列表
char_len = len(ascii_char)

pic = plt.imread(sys.argv[1])
#使用plt.imread方法来读取图像,对于彩图,返回size = heigth*width*3的图像
#matplotlib 中色彩排列是R G B
#opencv的cv2中色彩排列是B G R

pic_heigth,pic_width,_ = pic.shape
#获取图像的高、宽

gray = 0.2126 * pic[:,:,0] + 0.7152 * pic[:,:,1] + 0.0722 * pic[:,:,2]
#RGB转灰度图的公式 gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

#思路就是根据灰度值,映射到相应的ascii_char
for i in range(show_heigth):
    #根据比例映射到对应的像素
    y = int(i * pic_heigth / show_heigth)
    text = ""
    for j in range(show_width):
        x = int(j * pic_width / show_width)
        text += ascii_char[int(gray[y][x] / 256 * char_len)]
    if len(sys.argv) < 3 :
        print(text)
    else:
        writetxts(sys.argv[2],text)

``` def train(mnist): x = tf.placeholder(tf.float32, [None, INPUT_NODE], name='x-input') y_ = tf.placeholder(tf.float32, [None, OUTPUT_NODE], name='y-input') weights1 = tf.Variable( tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=0.1)) biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE])) weights2 = tf.Variable( tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1)) biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE])) #计算向前传播y的输出值,此处首次向前传播计算,不必使用滑动平均值来进行权值优化,固填为None y = inference(x, None, weights1, biases1, weights2, biases2) #存储训练轮数,变量为不可训练的变量 global_step = tf.Variable(0, trainable=False) #给定滑动平均衰减率和训练轮数的变量,初始化滑动平均类,给定训练轮数可以加快早期 #变量训练速度 variable_averages = tf.train.ExponentialMovingAverage( MOVING_AVERAGE_DECAY, global_step) #创建指数移动平均类 #在所有代表神经网络参数的变量上使用滑动平均,这个集合元素是所有没有指定 #trainable = False 的参数 variable_averages_op = variable_averages.apply( tf.trainable_variables()) #将上类作用于当前所有可训练变量 #计算使用滑动平均的Y值,这里调用之前定义的inference函数,获取参数 average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2) #计算交叉熵,作为刻画真实值y与预测值y_之间的差距 cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits( logits=y, labels=tf.argmax(y_, 1)) #计算当前BATCH中所有样例的交叉熵平均值 corss_entropy_mean = tf.reduce_mean(cross_entropy) #计算L2正则化损失函数 regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE) #计算模型正则化损失 regularization = regularizer(weights1) + regularizer(weights2) #总损失为交叉熵与正则化的和 loss = cross_entropy_mean + regularization #衰减学习率 global learning_rate learning_rate = tf.train.exponential_decay( LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE, LEARNING_RATE_DECAY) #最小化loss train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step) with tf.control_dependencies([train_step, Variables_averages_op]): train_op = tf.no_op(name='train') ``` 可以看到在前面的train函数中定义了learning_rate局部变量,但是在外部调用时出现变量未定义的报错,我定义全局变量也没有用![图片说明](https://img-ask.csdn.net/upload/201807/02/1530499378_484353.png)
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页