iT邦幫忙

1

Python 函數取用問題

各位大大好,目前我有兩個.py檔如下:

A.py

def A_1():
	x = [1,2,3]
	x_1 = [3,4,5]
	return x

def A_2(num):
	if num == 1:
		y = x * 3
	elif num == 2:
		y = x_1 * 3
	return y

B.py

import A
x = A.A_1()
A.A_2(num=1)

error:
NameError: name 'x' is not defined

我想要在A_2這個函數使用x這個list,但python似乎讀不到這個變數。
試過在A_1中加入global,還是沒辦法。

為什麼不直接在A_2中多加一個變數去讀取list,是因為想利用num控制參數,方便使用者調用函數,另外num大概會有五種狀況,使用不同的list。

所以想請問一下,有甚麼方法能夠解決此問題?
感謝大大們抽空回答!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
a26833765
iT邦新手 5 級 ‧ 2020-07-14 20:21:37
  1. 單看A.py的A_2(num),我沒有看到任何x的定義,所以編譯器會跳這個錯誤很合理
  2. 你應該是想要[1,2,3]*3 = [4, 5, 6],但實際上陣列不支援乘法,所以結果會是[1, 2, 3, 1, 2, 3, 1, 2, 3]

你的情形適合用class

把A.py改成下面就可以了

import numpy as np

class A():
    def __init__(self):
        self.x = None
    
    def A_1(self):
        x = np.array([1, 2, 3])
        x_1 = np.array([3, 4, 5])
        self.x = x
        return x.tolist()
    
    def A_2(self, num):
    	if num == 1:
    		y = self.x * 3
    	elif num == 2:
    		y = self.x_1 * 3
    	return y.tolist() 
froce iT邦大師 1 級 ‧ 2020-07-14 21:01:16 檢舉

有更好的方式啊...
dict。

然後要list內元素都乘3,你也不一定要numpy。
[3*elm for elm in lst]

yanwu0105 iT邦新手 5 級 ‧ 2020-07-14 21:14:01 檢舉

感謝 a26833765 大大,一直不是很了解class的操作,剛剛稍微review了class的用法。
問題大概能夠解決了!感謝大大!

1
froce
iT邦大師 1 級 ‧ 2020-07-14 21:10:21

A.py

_data = {
    1: [1, 2, 3],
    2: [3, 4, 5]
}


def a(num=1):
    return _data.get(num, [])*3
yanwu0105 iT邦新手 5 級 ‧ 2020-07-14 21:15:20 檢舉

感謝大大,是沒想到可以用字典存。
因為前面的list已經生成了,忘記可以存成字典型式
感謝大大!

0
一級屠豬士
iT邦大師 1 級 ‧ 2020-07-15 09:43:17

list 可以多層.

etalex iT邦新手 5 級 ‧ 2020-07-15 14:29:50 檢舉

/images/emoticon/emoticon01.gif

我要發表回答

立即登入回答