मेरे पास कई कार्य हैं जो मेरे प्रोग्राम द्वारा उपयोग किए जाने वाले विभिन्न वैश्विक चर को सहेजते हैं। उन्हें हमेशा एक साथ बुलाया जाता है और इसलिए मैंने उन्हें निम्नानुसार कॉल करने के लिए एक फ़ंक्शन बनाया:

def save_reflector(rf):
    with open('reflector.txt.',mode='w') as f:
        for num in rf:
            f.write(str(num)+'\n')

def save_rotors(r1,r2,r3,rpos1,rpos2,rpos3):
    with open('rotors.txt.',mode='w') as f:
        f.write(str(rpos1)+'\n')
        for num in r1:
            f.write(str(num)+'\n')

        f.write(str(rpos2)+'\n')
        for num in r2:
            f.write(str(num)+'\n')

        f.write(str(rpos3)+'\n')
        for num in r3:
            f.write(str(num)+'\n')

def save_wiring(wr):
    with open('wiring.txt.',mode='w') as f:
        for num in wr:
            f.write(str(num)+'\n')

def save_machine(r1,r2,r3,rpos1,rpos2,rpos3,wr,rf,v = None):#use v for verbose option
    if v is not None:
        print('Saving rotors...')
        save_rotors(r1,r2,r3,rpos1,rpos2,rpos3)
        print('Saving wiring...')
        save_wiring(wr)
        print('Saving reflector')
        save_reflector(rf)
        print('Machine Successfully saved')
    else:
        save_rotors(r1,r2,r3,rpos1,rpos2,rpos3)
        save_wiring(wr)
        save_reflector(rf)

इसलिए, मैं हमेशा इन कार्यों को एक साथ बुलाता हूं, अलग से कभी नहीं। यही कारण है कि मेरे साथ ऐसा हुआ कि मैं उन सभी को कॉल करने के लिए सिर्फ फंक्शन पर हूं। लेकिन इसके लिए मुझे बाहरी से आंतरिक कार्य (जो कम कुशल हो सकता है?) हालाँकि, save_machine() मेरे मुख्य लूप में उपयोग किए जाने पर अच्छे और अधिक पाइथोनिक लगता है।

मुझे यकीन नहीं है कि कौन सा अधिक पाइथोनिक या कुशल है और इसलिए किसी भी सलाह की सराहना की जाती है।

1
RhythmInk 8 जुलाई 2019, 19:23

2 जवाब

सबसे बढ़िया उत्तर

इस क्लस्टरिंग का अंतिम बिंदु कोड की पठनीयता और रखरखाव की सेवा करना है। चूंकि आपकी व्यावसायिक प्रक्रिया अनिवार्य करती है कि इन तीन कार्यों को क्रम में एक आसानी से नामित प्रक्रिया चरण save machine के रूप में बुलाया जाए, इसलिए इसे किसी फ़ंक्शन में लपेटना सही समझ में आता है। यह न केवल अधिक पाइथोनिक है, यह भाषा की परवाह किए बिना लगभग किसी भी एप्लिकेशन में समान अर्थ रखता है।

यह आपके कॉलिंग प्रोग्राम से अव्यवस्था को दूर करता है, और बाद के विकास की संभावना को कम करता है जिससे इस चरण को संभालने में त्रुटि होती है। आपने अपने कॉलिंग प्रोग्राम में कोडिंग की लगभग दस पंक्तियों को घटाकर केवल एक - फ़ंक्शन कॉल - कर दिया है।

1
Prune 8 जुलाई 2019, 19:34

इनपुट फॉरवर्ड करने में कुछ भी गलत नहीं है। संबंधित बयानों को एक साथ समूहबद्ध करने में सक्षम होना पहली जगह में विधियों का संपूर्ण बिंदु है।

आम तौर पर इस तरह कोड लिखते समय मैं निम्नलिखित मानसिकता से शुरू करता हूं। 2 घटनाएं संयोग हो सकती हैं, लेकिन तीन एक पैटर्न है। यानी यदि आप एक ही कोड को दो से अधिक बार लिख रहे हैं, जहां केवल एक चीज जो बदलती है वह है इनपुट वेरिएबल, तो यह एक फंक्शन बनाने का समय है।

आइए for num in rf: ... कोड से शुरू करें। मैं इसे हर जगह देखता हूं। आइए उस तर्क को अपने तरीके से आगे बढ़ाते हैं:

def write_r(f, r):
    for num in r:
        f.write(str(num)+'\n')

def save_reflector(rf):
    with open('reflector.txt.',mode='w') as f:
        write_r(f, rf)

def save_wiring(rf):
    with open('wiring.txt.',mode='w') as f:
        write_r(f, rf)

अब थोड़े से काम से, save_rotors को n इनपुट के जोड़े को संभालने के लिए बनाया जा सकता है

def save_rotors(r_list, rpos_list):
    with open('rotors.txt.',mode='w') as f:
        with r, rpos in zip(r_list, rpos_list)
            f.write(str(rpos)+'\n')
            write_r(f, r)

आपकी मुख्य विधि अभी भी वही है:

def save_machine(r1,r2,r3,rpos1,rpos2,rpos3,wr,rf,v = None):
    ...
    save_rotors([r1,r2,r3],[rpos1,rpos2,rpos3])
    save_wiring(wr)
    save_reflector(rf)
1
flakes 8 जुलाई 2019, 19:36