পাইথনে স্টেটমেন্ট দিলে বাসা বেঁধে লেখার আরও কী ভাল উপায় আছে? [বন্ধ]


34

নেস্টেড করার মতো আরও অজগর উপায় আছে যদি এর চেয়ে অন্য বিবৃতি থাকে:

def convert_what(numeral_sys_1, numeral_sys_2):

    if numeral_sys_1 == numeral_sys_2:      
        return 0
    elif numeral_sys_1 == "Hexadecimal":
        if numeral_sys_2 == "Decimal":
            return 1
        elif numeral_sys_2 == "Binary":
            return 2
    elif numeral_sys_1 == "Decimal":
        if numeral_sys_2 == "Hexadecimal":
            return 4
        elif numeral_sys_2 == "Binary":
            return 6
    elif numeral_sys_1 == "Binary":
        if numeral_sys_2 == "Hexadecimal":
            return 5
        elif numeral_sys_2 == "Decimal":
            return 3
    else:
        return 0

এই স্ক্রিপ্টটি একটি সাধারণ রূপান্তরকারীর একটি অংশ।


অন্য কোনও ডেটা স্ট্রাকচার ব্যবহার না করে আপনি নেস্টেড ইফ-অন্য বিবৃতিগুলিকে andশীর্ষ স্তরের যদি-অন্য বিবৃতিতে শর্তে সরিয়ে নিতে পারেন। এটি কমপক্ষে সেভাবে আরও পঠনযোগ্য হবে। দুঃখের বিষয়, অজগরটির সুইচ স্টেটমেন্ট নেই।
অ্যাডামগ্রাই

এই হল pythonic উপায়। পাইথন ইচ্ছাকৃতভাবে স্যুইচ বিবৃতি সমর্থন করে না। দেখুন python.org/dev/peps/pep-3103
Jongmin Baek

1
প্রশ্নটি মোটেও নয়, তবে আপনি যদি বিষয়গুলিকে আরও পাইথোনিক করার চেষ্টা করছেন তবে কীভাবে প্রতিস্থাপনের মান বা প্রত্যাবর্তনের মানগুলির জন্য এনাম তৈরি করা যায় - "ম্যাজিক সংখ্যার" চেয়ে কোনও পাঠকের পক্ষে ভাল ....
ম্যাটস উইচম্যান

উত্তর:


13

@ আরিরেজ এবং @ সেন্সারএইচ এর উত্তরগুলি কাজ করার সময়, প্রতিটি সম্ভাব্য মান numeral_sys_1বারবার লিখতে হয় প্রতিটি সম্ভাব্য মানের জন্য numeral_sys_2যখন মূল্য জোড়গুলি তালিকাভুক্ত করা হয় তখন সম্ভাব্য মানগুলির সংখ্যা বৃদ্ধি পেলে ডাটা স্ট্রাকচারকে বজায় রাখা আরও শক্ত করে তোলে। পরিবর্তে যদি বিবৃতি দেওয়া থাকে তবে আপনি নেস্টের জায়গায় নেস্টেড ডিক ব্যবহার করতে পারেন:

mapping = {
    'Hexadecimal': {'Decimal': 1, 'Binary': 2},
    'Binary': {'Decimal': 3, 'Hexadecimal': 5},
    'Decimal': {'Hexadecimal': 4, 'Binary': 6}
}
def convert_what(numeral_sys_1, numeral_sys_2):
    return mapping.get(numeral_sys_1, {}).get(numeral_sys_2, 0)

বিকল্পভাবে, আপনি itertools.permutationsপদ্ধতির সাহায্যে ম্যাপিংয়ের জন্য মানগুলির জোড়া তৈরি করতে পারেন , যার ক্রমটি ইনপুট ক্রম অনুসারে:

mapping = dict(zip(permutations(('Hexadecimal', 'Decimal', 'Binary'), r=2), (1, 2, 4, 6, 3, 5)))
def convert_what(numeral_sys_1, numeral_sys_2):
    return mapping.get((numeral_sys_1, numeral_sys_2), 0)

29

একটি থেকে সকল বৈধ সমন্বয় ঢোকান dictionaryএর tupleগুলি, এবং যদি সমন্বয় নেই ফিরে 0:

def convert_what(numeral_sys_1, numeral_sys_2):
    numeral_dict = {
        ("Hexadecimal", "Decimal"    ) : 1,
        ("Hexadecimal", "Binary"     ) : 2,
        ("Decimal",     "Hexadecimal") : 4, 
        ("Decimal",     "Binary"     ) : 6,
        ("Binary",      "Hexadecimal") : 5,
        ("Binary",      "Decimal"    ) : 3
    }
    return numeral_dict.get((numeral_sys_1, numeral_sys_2), 0)

আপনি যদি লুপটিতে ফাংশনটি ব্যবহার করার পরিকল্পনা করছেন, তবে ফাংশনটির বাইরে অভিধানটি সংজ্ঞায়িত করা আরও ভাল ধারণা হতে পারে, তাই ফাংশনে প্রতিটি কল করে এটি পুনরায় তৈরি করা হবে না।



@ রোমানপেরেখারেস্ট আমি এটি যুক্ত করেছি, যদিও এই নির্দিষ্ট প্রশ্নে, ফাংশনে নিজেই অন্য ধরণের ত্রুটি তৈরি করতে পারে না যা তার মূল ফাংশন থেকে আলাদা আউটপুট দেয়।
আরিরেজ

1
পেরেনগুলি ভিতরে অনর্থক []। খালি tuple ব্যতীত, এটি কমা যা এটিকে একটি টিউপল করে তোলে, প্রথম বন্ধনী নয়, এটি কেবলমাত্র কিছু ক্ষেত্রে ক্রিয়াকলাপের জন্য।
গিল্চ

4
আপনি কেবলমাত্র বিবৃতিটির পরিবর্তে ডিফল্টর .get()সাথে ডিক পদ্ধতিটি ব্যবহার করতে পারেন । 0try
গিল্চ

@ গিল্চ আমি প্রথম বন্ধনী ফেলেছি তবে আমি try:... except:...কাঠামোর মতো করি do
আর্যরেজ

17

আপনি যদি নিশ্চিত হন যে অন্য কোনও মান নেই তবে numeral_sys_1 এবং numeral_sys_2 ভেরিয়েবল সেট করা যেতে পারে এটি হ'ল সহজ এবং পরিষ্কার সমাধান।

অন্যদিকে, আপনার অভিধানটি যদি হেক্সাডেসিমাল, "দশমিক" এবং "বাইনারি" ব্যতীত অন্য কোনও মান থাকে তবে উপলভ্য মানগুলির সাথে সংমিশ্রণের সাথে অভিধানটি প্রসারিত করতে হবে

যুক্তি এখানে; যদি অভিধান কীগুলিতে ভেরিয়েবল টিপলগুলি প্রদত্ত ভেরিয়েবল টিপলের সমান না হয়, .get () পদ্ধতিটি "0" প্রদান করে। যদি ভেরিয়েবল টিপল দেওয়া হয় তবে অভিধানে কোনও কী মেলে সুতরাং ম্যাচিংয়ের কীটির মান ফিরে আসবে।

def convert_what(numeral_sys_1, numeral_sys_2):
    return {
        ("Hexadecimal", "Decimal") : 1, 
        ("Hexadecimal", "Binary") : 2, 
        ("Binary", "Decimal") : 3,
        ("Decimal", "Hexadecimal") : 4,
        ("Binary", "Hexadecimal") : 5, 
        ("Decimal", "Binary") : 6, 
     }.get((numeral_sys_1, numeral_sys_2), 0)

জেনারেটর ব্যবহার করে একটি সমাধান হতে পারে। অনেক বেশি স্মার্ট দেখায়, তবে আমি মনে করি এই সাধারণ প্রয়োজনে জেনারেটর ব্যবহারের চেয়ে হার্ড কোডড ডিকশনারিটি দ্রুততর হবে।


সর্বশেষ 'অন্য: রিটার্ন 0' সম্পর্কে আমার ব্যাখ্যাটি হ'ল আর্গুমেন্টগুলি মেলে না এবং তালিকায় থাকা (যেমন আপনার ডিক্ট কীগুলি) পাশে থাকা অন্য কিছু হতে পারে।
টোকড

@ টোকোড হ্যাঁ, আপনি ঠিক বলেছেন। তবে এই পদ্ধতিটিও একই কার্যকারিতা সরবরাহ করে। যদি কোনও বা উভয় যুক্তি পদ্ধতিতে দেওয়া হয় তবে বলুন, স্ট্রিং নয়, এমনকি কোনও ধরণের মান নয়; .get () পদ্ধতি অভিধানে কী না থাকার কারণে "0" প্রত্যাবর্তন করে। এটা সহজ না?
সেন্সর এইচ।

আপনি শুধু আরিরেজ উত্তর কপি করেননি?
মার্টিন

পছন্দ করেছেন আপনি স্পষ্টভাবে পয়েন্টটি মিস করছেন। কিছু করার অনেক উপায় আছে তবে সঠিক পদ্ধতি শেখানো আমি এখানে করতে ইচ্ছুক। আসলে নীচে আরও ভাল উত্তর আছে। ফারাকানয়েদ এর সমাধান দেখুন। এটি ত্রুটিহীন এবং অনুগ্রহ পেতে হবে।
সেন্সর এইচ।

@ সেন্সারএইচ। পার্থক্যটি ছিল কেবল আপনি ডিকের পদ্ধতিটি () ব্যবহার করেছিলেন যা মূল উত্তরটির চেষ্টা / ব্যতীত মূলত যা। আপনি এই সত্যটি অস্বীকার করতে পারবেন না যে আপনি ধারণাটি অনুলিপি করেছেন এবং খুব সামান্য (উন্নতি না করে) সংশোধিত এবং প্রকাশ করেছেন
মার্টিন

3

নেস্টেড তালিকা ব্যবহার করে একটি বিকল্প উপায়। আশা করি এটা সাহায্য করবে!!

def convert_what(numeral_sys_1, numeral_sys_2):

    l1 = [["Hexadecimal","Decimal"],["Hexadecimal","Binary"],
            ["Decimal","Hexadecimal"],["Decimal","Binary"],
            ["Binary","Hexadecimal"],["Binary","Decimal"]]

    return l1.index([numeral_sys_1, numeral_sys_2]) + 1 if [numeral_sys_1,numeral_sys_2] in l1 else 0

2

আমার মতে এই convert_whatফাংশনটি খুব একটা পাইথোনিক নয়। আমি অনুমান করি যে কোডটি এই কোডটিকে কল করে তার বিবরণগুলিরও একটি গুচ্ছ রয়েছে এবং এর ফেরত মানের উপর নির্ভর করে রূপান্তর করে convert_what()। আমি এই জাতীয় কিছু প্রস্তাব:

প্রথম পদক্ষেপ, প্রতিটি সংমিশ্রনের জন্য একটি ফাংশন তৈরি করুন:

def hex_dec(inp):
    return 1234  # todo implement
# do the same for hex_bin, bin_dec, dec_hex, bin_hex, dec_bin

দ্বিতীয় পদক্ষেপ, একটি ডিক মধ্যে ফাংশন বস্তু রাখুন। মনে রাখবেন যে ফাংশন নামের পরে কোনও () নেই, কারণ আমরা ফাংশন অবজেক্টটি সংরক্ষণ করতে চাই এবং এটি এখনও কল করতে চাই না:

converter_funcs = {
    ("Hexadecimal", "Decimal"): hex_dec,
    ("Hexadecimal", "Binary"): hex_bin,
    ("Binary", "Decimal"): bin_dec,
    ("Decimal", "Hexadecimal"): dec_hex,
    ("Binary", "Hexadecimal"): bin_hex,
    ("Decimal", "Binary"): dec_bin,
}

তৃতীয় এবং শেষ পদক্ষেপ, একটি রূপান্তর ফাংশন বাস্তবায়ন। যদি বিবৃতি উভয় সিস্টেম একই হয় কিনা তা পরীক্ষা করে থাকে। তারপরে, আমরা আমাদের ডিক থেকে সঠিক ফাংশনটি পাই এবং এটিকে কল করি:

def convert(input_number, from_sys, to_sys):
    if from_sys == to_sys:
        return input_number
    func = converter_funcs[(from_sys, to_sys)]
    return func(input_number)

2

এটি বেশিরভাগ ভাষায় স্যুইচ-কেস স্টেটমেন্ট দ্বারা সম্পন্ন হয়। পাইথনে, আমি একটি অভিব্যক্তি অভিধান সহ একটি সাধারণ ফাংশন ব্যবহার করি।

কোড:

def convert_what(numeral_sys_1, numeral_sys_2):
    myExpressions = {"Hexadecimal" : {"Decimal" : 1, "Binary" : 2},
                    "Decimal" : {"Hexadecimal" : 4, "Binary" : 6}, 
                    "Binary" : {"Hexadecimal" : 5, "Decimal" : 3}}
    return (myExpressions.get(numeral_sys_1, {})).get(numeral_sys_2, 0)

আউটপুট:

> convert_what("Hexadecimal", "Decimal")
> 1
> convert_what("Binary", "Binary")
> 0
> convert_what("Invalid", "Hexadecimal")
> 0

এটি শীর্ষ উত্তরের একটি ভাল বিকল্প এবং আরও মানগুলিতে প্রসারিত করা আরও সহজ।
gkhnavarro

এটি পূর্ববর্তী উত্তরের সাথে বেশ সমান: স্ট্যাকওভারফ্লো . com/ a/ 58985114 / 1895261 । এছাড়াও, আমি মনে করি যে সংখ্যাটি_সিস_উইটি বাহ্যিক ডিক্টে নেই সেই ক্ষেত্রে শেষ পংক্তিতে 0-র পরিবর্তে খালি ডিকটি ফিরিয়ে দেওয়া উচিত: রিটার্ন (myExpressions.get (numeral_sys_1, {})) পান ((সংখ্যাটি_সিস 3, 0)
সেপিয়া

মডিউল_আর প্রশ্নে @ সেপিয়া অন্য বিবৃতিতে 0 দেয়, যার অর্থ 0 কোনও কিছুই প্রত্যাখ্যান এবং সমতা পরিস্থিতির সাথে মিলিত হয় না।
ফারকানয়েদ

1
আপনার কোড সহ মুদ্রণ (রূপান্তর_ কী ("অবৈধ", "হেক্সাডেসিমাল")) চালানোর চেষ্টা করুন। এটি একটি ত্রুটি বাড়িয়ে তুলবে: "AttributeError: 'int' অবজেক্টটির 'get' অ্যাট্রিবিউট নেই। প্রথম 0 টি খালি ডিকের ({}) এর সাথে প্রতিস্থাপন করা ফাংশনটি সঠিকভাবে 0 ফেরত দিতে হবে যদি numeral_sys_1 অবৈধ হয়।
সেপিয়া

1

সাধারণভাবে আমি কাজটি যদি নেস্টেডের জন্য ডিকশনারি সলিউশনের সাথে চালাতাম। কিছু বিশেষ ক্ষেত্রে অন্য পদ্ধতির দিকে নিয়ে আসতে পারে। এটার মত:

def convert_what(numeral_sys_1, numeral_sys_2):

    num = ['Hexadecimal','Decimal','Binary']
    tbl = [[0,1,2],
           [4,0,6],
           [5,3,0]]
    try:
        return tbl[num.index(numeral_sys_1)][num.index(numeral_sys_2)]
    except ValueError:
        return 0

1

যেমন কিছু সম্পর্কে:

def convert_what(numeral_sys_1, numeral_sys_2):
    src = numeral_sys_1, numeral_sys_2
    if src == "Hexadecimal", "Decimal":
        return 1
    if src == "Hexadecimal", "Binary"
        return 2
    # You get the gist.... 
    if src == "Decimal", "Binary":
        return 6
    return 0 

1

একটি আইডিয়া একটি তালিকা ব্যবহার করছে এবং ফলাফলের সূচক পাবে, যেমন।

def convert_what(numeral_sys_1, numeral_sys_2):
    if numeral_sys_1 == numeral_sys_2:      
        return 0
    return ["HexadecimalDecimal", "HexadecimalBinary", "BinaryDecimal", "DecimalHexadecimal", "BinaryHexadecimal", "DecimalBinary" ].index(numeral_sys_1 + numeral_sys_2) + 1

আকর্ষণীয় পরামর্শ কিন্তু এটি কার্যকর হয় না যখন আর্গুমেন্টগুলি ("দশমিক", "নয়") হয়, যার ফলশ্রুতিতে ভ্যালুআররিয়ার: 'ডেসিমালনট' তালিকায় নেই
টোকড

1

@ সাদাপ যেমন বলেছে,

আমার মতে এই convert_whatফাংশনটি খুব একটা পাইথোনিক নয়। আমি অনুমান করি যে কোডটি এই কোডটিকে কল করে তার বিবরণগুলিরও একটি গুচ্ছ রয়েছে এবং এর ফেরত মানের উপর নির্ভর করে রূপান্তর করে convert_what()। আমি এই জাতীয় কিছু প্রস্তাব:

আপনি পূর্ণসংখ্যার জন্য বেস রূপান্তর বাস্তবায়ন করছেন, তাহলে আপনি সম্ভবত যাহাই হউক না কেন একটি সাধারণ উপস্থাপনা মাধ্যমে চালু করছেন যারা int। প্রতিটি জোড়া ঘাঁটির জন্য পৃথক ফাংশন প্রয়োজন হয় না, এবং জড়িত দুটি ঘাঁটি একে অপরের সম্পর্কেও জানতে হবে না।

ইনপুট

একটি নম্বর সিস্টেমের নাম থেকে এর ভিত্তিতে একটি ম্যাপিং তৈরি করুন:

BINARY = "Binary"
DECIMAL = "Decimal"
HEXADECIMAL = "Hexadecimal"

BASES = {
    BINARY: 2,
    DECIMAL: 10,
    HEXADECIMAL: 16,
}

আপনাকে ইনপুটগুলি পড়তে দেয় int(text, BASES[numeral_sys_1])

আউটপুট

একটি নম্বর সিস্টেমের নাম থেকে ফর্ম্যাট নির্দিষ্টকরণকারীর কাছে একটি ম্যাপিং তৈরি করুন :

FORMATTERS = {
    BINARY: "b",
    DECIMAL: "d",
    HEXADECIMAL: "x",
}

আপনাকে আউটপুট লেখার অনুমতি দেয় format(n, FORMATTERS[numeral_sys_2])

উদাহরণ ব্যবহার

def convert(text, numeral_sys_1, numeral_sys_2):
    n = int(text, BASES[numeral_sys_1])
    return format(n, FORMATTERS[numeral_sys_2])

হয় পরিবর্তে মান ফাংশন করে ডিককে আরও সাধারণ করা যেতে পারে, যদি আপনাকে int(x, base)বিল্ট-ইন ইন্টিজার ফর্ম্যাটিং সমর্থনগুলির চেয়ে আলাদা আলাদা ফর্ম্যাটগুলির সমর্থন করতে হয় , বা আরও আউটপুট বেসগুলি সমর্থন করতে হয়।


0

আমি কোড শুকিয়ে রাখতে চাই:

def convert_what_2(numeral_sys_1, numeral_sys_2):
    num_sys = ["Hexadecimal", "Decimal", "Binary"]
    r_value = {0: {1: 1, 2: 2},
               1: {0: 4, 2: 6},
               2: {0: 5, 1: 3} }
    try:
        value = r_value[num_sys.index(numeral_sys_1)][num_sys.index(numeral_sys_2)]
    except KeyError: # Catches when they are equal or undefined
        value = 0
    return value

0

অন্যান্য কৌশলগুলি সরবরাহ করে এবং একত্রিত করে এমন কিছু কৌশল ব্যবহার করে:

def convert(key1, key2):
    keys = ["Hexadecimal", "Decimal", "Binary"]
    combinations = {(0, 1): 1, (0, 2): 2, (1, 0): 4, (1, 2): 6, (2, 0): 5, (2, 1): 3} # use keys indexes to map to combinations
    try:
        return combinations[(keys.index(key1), keys.index(key2))]
    except (KeyError, ValueError): # if value is not in list, return as 0
        return 0

-1

যদিও এই পদ্ধতিটি দ্রুত কিনা তা নিশ্চিত নন, তবে নাম্বার ব্যবহার করেও এটি করা যেতে পারে:

conditions = [
    ("Hexadecimal", "Decimal"), ("Hexadecimal", "Binary"),
    ("Binary", "Decimal"), ("Decimal", "Hexadecimal"), ("Binary", "Hexadecimal"), ("Decimal", "Binary")]
choices = [1,2,3,4,5,6]

এবং হিসাবে ব্যবহার করা যেতে পারে:

 np.select(conditions, choices, default=0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.