簡體   English   中英

函數在命令行上起作用,但在腳本中不起作用

[英]Functions works on command line, but not in script

我在自己的名為MTG.py的文件中定義了以下函數。 應該以一個鄰接矩陣為輸入,並創建一個圖形。

import pygraphviz as pgv
import numpy as np

def matrix_to_graph(M):
    A = pgv.AGraph()
    for i in range(0, np.shape(M)[0]):
        for j in range(0, np.shape(M)[0]):
            if i < j and M[i][j] == 1:
                A.add_edge(i,j)
    A.write('M.dot')
    C = pgv.AGraph('M.dot')
    C.layout()
    C.draw('M.png')

當我從命令行運行時

from MTG import matrix_to_graph
M = [[0, 1, 0, 1, 1], [1, 0, 1, 1, 0], [0, 1, 0, 0, 0], [1, 1, 0, 0, 1], [1, 0, 0, 1, 0]]
matrix_to_graph(M)

我得到的正是我想要的,這是打印到M.png的正確圖形。

但是,如果我在上面的代碼中添加了代碼(沒有縮進,即超出了函數的定義)

M = input("Enter an adjacency matrix:")
matrix_to_graph(M)

我得到錯誤

 for i in range(0, np.shape(M)[0]):
IndexError: tuple index out of range

我想發生這種情況是因為輸入函數接受了我認為是矩陣的東西,但實際上是其他東西。 我試圖通過使用np.matrix(M)來糾正此問題,但這將矩陣轉換為1x16向量。 我是Python的新手,我敢肯定有1000種方法可以更好地做到這一點,但是我真的很想弄清楚為什么這種特殊方法無法正常工作。

我正在使用PyCharm 2017.1.3(社區版,如果有關系的話)和Python 3.6。

Python 3的input返回一個str ,它不會將其解析為一個Python數據結構,只是因為其內容看起來像一個Python文字。 在這種情況下,如果您希望能夠輸入int s文字listlist ,我建議使用ast.literal_eval來(安全地)將表示矩陣文字的字符串轉換為list本身:

import ast

M = ast.literal_eval(input("Enter an adjacency matrix:"))

您可能已經習慣了Python 2,其中input等效於在Python 3中執行eval(input(...)) ,但是該input版本很危險,有充分的理由將其刪除。 ast.literal_eval您的需求,而無需執行任意代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM