2012-04-13 33 views
10

nếu tôi có điều này:biến Calling định nghĩa bên trong một chức năng từ một chức năng

def oneFunction(lists): 
    category=random.choice(list(lists.keys())) 
    word=random.choice(lists[category]) 

def anotherFunction(): 
    for letter in word:    #problem is here 
     print("_",end=" ") 

Tôi đã định nghĩa trước lists, vì vậy oneFunction(lists) tác phẩm hoàn hảo.

Vấn đề của tôi đang kêu gọi word phù hợp 6. Tôi đã cố gắng để xác định word ngoài chức năng đầu tiên với cùng định nghĩa word=random.choice(lists[category]), nhưng mà làm cho word luôn luôn giống nhau, ngay cả khi tôi gọi oneFunction(lists).

Tôi muốn có thể, mỗi khi tôi gọi hàm đầu tiên và sau đó là hàm thứ hai, có một khác nhau word.

Tôi có thể làm điều này mà không cần xác định rằng word bên ngoài oneFunction(lists) không?

+2

Tại sao không chuyển 'từ' làm đối số cho' anotherFunction'? Hãy xem xét 'def anotherFunction (word):' và gọi nó cho phù hợp. –

Trả lời

21

Có, bạn nên nghĩ đến việc xác định cả chức năng của mình trong một Lớp và tạo thành một từ. Điều này là sạch hơn

class Spam: 
    def oneFunction(self,lists): 
     category=random.choice(list(lists.keys())) 
     self.word=random.choice(lists[category]) 

    def anotherFunction(self): 
     for letter in self.word:    
     print("_",end=" ") 

Khi bạn tạo Lớp học, bạn phải khởi tạo nó đến một đối tượng và truy cập các chức năng của thành viên.

s = Spam() 
s.oneFunction(lists) 
s.anotherFunction() 

cách tiếp cận khác sẽ được thực hiện oneFunction trở lại từ để bạn có thể sử dụng oneFunction thay vì từ trong anotherFunction

>>> def oneFunction(lists): 
     category=random.choice(list(lists.keys())) 
     return random.choice(lists[category]) 


>>> def anotherFunction(): 
     for letter in oneFunction(lists):    
     print("_",end=" ") 

Và cuối cùng, bạn cũng có thể làm cho anotherFunction, chấp nhận lời như một tham số mà bạn có thể chuyển từ kết quả gọi số oneFunction

>>> def anotherFunction(words): 
     for letter in words:    
     print("_",end=" ") 
>>> anotherFunction(oneFunction(lists)) 
+0

cảm ơn bạn! Trong cách tiếp cận đầu tiên, bạn có thể giải thích cho tôi chính xác phần 'self' có làm gì không? Nó là một đối số cho hàm? – JNat

+0

@JNat: 'self' cung cấp cho bạn tham chiếu đến đối tượng hiện tại, giống như những gì' this' (con trỏ) hoặc 'this' (biến) phục vụ trong các ngôn ngữ OOP đáng chú ý. – Abhijit

+0

python nói với tôi 'self' không được định nghĩa ... tại sao vậy? Tôi có cần phải nhập một số mô-đun trước hoặc một cái gì đó? – JNat

1
def anotherFunction(word): 
    for letter in word:    
     print("_", end=" ") 

def oneFunction(lists): 
    category = random.choice(list(lists.keys())) 
    word = random.choice(lists[category]) 
    return anotherFunction(word) 
+0

Bạn có thể chuyển biến từ từ hàm đầu tiên 'oneFunction' sang hàm khác. Tuy nhiên, tôi đoán bạn phải đặt các chức năng khác đầu tiên ít hơn bạn nhận được một lỗi, "anotherFunction không được xác định". Ngoài ra, tôi nhận thấy, bạn không làm bất cứ điều gì với biến 'thư' mà bạn đã tham chiếu trong vòng lặp –

1

Tùy chọn đơn giản nhất là sử dụng biến toàn cầu. Sau đó, tạo một hàm nhận từ hiện tại.

current_word = '' 
def oneFunction(lists): 
    global current_word 
    word=random.choice(lists[category]) 
    current_word = word 

def anotherFunction(): 
    for letter in get_word():    
      print("_",end=" ") 

def get_word(): 
     return current_word 

Lợi thế của điều này là có thể chức năng của bạn nằm trong các mô-đun khác nhau và cần truy cập biến.

4

Mọi thứ trong python được coi là đối tượng nên các hàm cũng là các đối tượng. Vì vậy, bạn có thể sử dụng phương pháp này là tốt.

def fun1(): 
    fun1.var = 100 
    print(fun1.var) 

def fun2(): 
    print(fun1.var) 

fun1() 
fun2() 

print(fun1.var) 
Các vấn đề liên quan