আনপ্যাকিং, প্রসারিত আনপ্যাকিং এবং নেস্টেড বর্ধিত আনপ্যাকিং


105

নিম্নলিখিত প্রকাশগুলি বিবেচনা করুন। নোট করুন যে "প্রসঙ্গ" উপস্থাপনের জন্য কিছু অভিব্যক্তি পুনরাবৃত্তি হয়েছে।

(এটি একটি দীর্ঘ তালিকা)

a, b = 1, 2                          # simple sequence assignment
a, b = ['green', 'blue']             # list asqignment
a, b = 'XY'                          # string assignment
a, b = range(1,5,2)                  # any iterable will do


                                     # nested sequence assignment

(a,b), c = "XY", "Z"                 # a = 'X', b = 'Y', c = 'Z' 

(a,b), c = "XYZ"                     # ERROR -- too many values to unpack
(a,b), c = "XY"                      # ERROR -- need more than 1 value to unpack

(a,b), c, = [1,2],'this'             # a = '1', b = '2', c = 'this'
(a,b), (c,) = [1,2],'this'           # ERROR -- too many values to unpack


                                     # extended sequence unpacking

a, *b = 1,2,3,4,5                    # a = 1, b = [2,3,4,5]
*a, b = 1,2,3,4,5                    # a = [1,2,3,4], b = 5
a, *b, c = 1,2,3,4,5                 # a = 1, b = [2,3,4], c = 5

a, *b = 'X'                          # a = 'X', b = []
*a, b = 'X'                          # a = [], b = 'X'
a, *b, c = "XY"                      # a = 'X', b = [], c = 'Y'
a, *b, c = "X...Y"                   # a = 'X', b = ['.','.','.'], c = 'Y'

a, b, *c = 1,2,3                     # a = 1, b = 2, c = [3]
a, b, c, *d = 1,2,3                  # a = 1, b = 2, c = 3, d = []

a, *b, c, *d = 1,2,3,4,5             # ERROR -- two starred expressions in assignment

(a,b), c = [1,2],'this'              # a = '1', b = '2', c = 'this'
(a,b), *c = [1,2],'this'             # a = '1', b = '2', c = ['this']

(a,b), c, *d = [1,2],'this'          # a = '1', b = '2', c = 'this', d = []
(a,b), *c, d = [1,2],'this'          # a = '1', b = '2', c = [], d = 'this'

(a,b), (c, *d) = [1,2],'this'        # a = '1', b = '2', c = 't', d = ['h', 'i', 's']

*a = 1                               # ERROR -- target must be in a list or tuple
*a = (1,2)                           # ERROR -- target must be in a list or tuple
*a, = (1,2)                          # a = [1,2]
*a, = 1                              # ERROR -- 'int' object is not iterable
*a, = [1]                            # a = [1]
*a = [1]                             # ERROR -- target must be in a list or tuple
*a, = (1,)                           # a = [1]
*a, = (1)                            # ERROR -- 'int' object is not iterable

*a, b = [1]                          # a = [], b = 1
*a, b = (1,)                         # a = [], b = 1

(a,b),c = 1,2,3                      # ERROR -- too many values to unpack
(a,b), *c = 1,2,3                    # ERROR - 'int' object is not iterable
(a,b), *c = 'XY', 2, 3               # a = 'X', b = 'Y', c = [2,3]


                                     # extended sequence unpacking -- NESTED

(a,b),c = 1,2,3                      # ERROR -- too many values to unpack
*(a,b), c = 1,2,3                    # a = 1, b = 2, c = 3

*(a,b) = 1,2                         # ERROR -- target must be in a list or tuple
*(a,b), = 1,2                        # a = 1, b = 2

*(a,b) = 'XY'                        # ERROR -- target must be in a list or tuple
*(a,b), = 'XY'                       # a = 'X', b = 'Y'

*(a, b) = 'this'                     # ERROR -- target must be in a list or tuple
*(a, b), = 'this'                    # ERROR -- too many values to unpack
*(a, *b), = 'this'                   # a = 't', b = ['h', 'i', 's']

*(a, *b), c = 'this'                 # a = 't', b = ['h', 'i'], c = 's'

*(a,*b), = 1,2,3,3,4,5,6,7           # a = 1, b = [2, 3, 3, 4, 5, 6, 7]

*(a,*b), *c = 1,2,3,3,4,5,6,7        # ERROR -- two starred expressions in assignment
*(a,*b), (*c,) = 1,2,3,3,4,5,6,7     # ERROR -- 'int' object is not iterable
*(a,*b), c = 1,2,3,3,4,5,6,7         # a = 1, b = [2, 3, 3, 4, 5, 6], c = 7
*(a,*b), (*c,) = 1,2,3,4,5,'XY'      # a = 1, b = [2, 3, 4, 5], c = ['X', 'Y']

*(a,*b), c, d = 1,2,3,3,4,5,6,7      # a = 1, b = [2, 3, 3, 4, 5], c = 6, d = 7
*(a,*b), (c, d) = 1,2,3,3,4,5,6,7    # ERROR -- 'int' object is not iterable
*(a,*b), (*c, d) = 1,2,3,3,4,5,6,7   # ERROR -- 'int' object is not iterable
*(a,*b), *(c, d) = 1,2,3,3,4,5,6,7   # ERROR -- two starred expressions in assignment


*(a,b), c = 'XY', 3                  # ERROR -- need more than 1 value to unpack
*(*a,b), c = 'XY', 3                 # a = [], b = 'XY', c = 3
(a,b), c = 'XY', 3                   # a = 'X', b = 'Y', c = 3

*(a,b), c = 'XY', 3, 4               # a = 'XY', b = 3, c = 4
*(*a,b), c = 'XY', 3, 4              # a = ['XY'], b = 3, c = 4
(a,b), c = 'XY', 3, 4                # ERROR -- too many values to unpack

কীভাবে হাতের মাধ্যমে এই জাতীয় এক্সপ্রেশনগুলির ফলাফলকে সঠিকভাবে কেটে নেওয়া যায়?


28
সত্য, আপনি প্রতিদিন কোডে যা দেখেন তার চেয়ে বেশিরভাগই জটিল complicated তালিকাগুলি আন-প্যাক করার জন্য বেসিকগুলি শিখুন এবং আপনি ভাল থাকবেন।
রাফে কেটলার

2
নোট করুন যে এগুলি পুনরাবৃত্ত হয়। সুতরাং, যদি আপনি প্রথম কয়েকটিকে নীচে আন্ডার করে থাকেন তবে আপনি সবকিছু পরিচালনা করতে পারেন। উদাহরণস্বরূপ, * (* ক, খ) * x এর সাথে প্রতিস্থাপনের চেষ্টা করুন, কী এক্স আনপ্যাকগুলি আবিষ্কার করুন এবং তারপরে এক্স ইত্যাদির জন্য প্লাগ ইন (* ক, খ) করুন
পিটারিস

4
@ গ্রেনজিট আমি নিজেকে পাইথনের একটি উন্নত জ্ঞান হিসাবে বিবেচনা করি এবং আমি কেবল সাধারণ নিয়মগুলি জানি: :) আপনাকে প্রতিটি কোণার বিষয়গুলি জানতে হবে না, আপনাকে কেবল কখনও কখনও কোনও দোভাষীকে বের করে দেওয়ার এবং কোনও কিছু পরীক্ষা করার প্রয়োজন হয়।
রাফা কেটলার

বাহ দুর্দান্ত তালিকা। a, *b = 1, 2, 3আনপ্যাকিংয়ের ধরণ সম্পর্কে আমি সত্যিই জানতাম না । তবে এই পাই 3 কে ঠিক আছে?
নিক্লাস আর

উত্তর:


113

এই পোস্টের দৈর্ঘ্যের জন্য আমার ক্ষমাপ্রার্থী, তবে আমি সম্পূর্ণতার বিকল্পটি বেছে নেওয়ার সিদ্ধান্ত নিয়েছি।

একবার আপনি কয়েকটি বেসিক নিয়মগুলি জানতে পারলে এগুলি সাধারণ করা কঠিন নয়। আমি কয়েকটি উদাহরণ দিয়ে ব্যাখ্যা করার জন্য যথাসাধ্য চেষ্টা করব। যেহেতু আপনি এই "হাত ধরে" মূল্যায়ন করার বিষয়ে কথা বলছেন, আমি কিছু সহজ প্রতিস্থাপনের নিয়ম প্রস্তাব করব। মূলত, যদি সমস্ত পুনরাবৃত্তি একইভাবে ফরম্যাট করা হয় তবে আপনি কোনও এক্সপ্রেশন বোঝা আরও সহজ মনে করতে পারেন।

কেবল আনপ্যাকিংয়ের উদ্দেশ্যে, নিম্নলিখিত বিকল্পগুলি ডানদিকে =(যেমন মূল্যবোধের জন্য ) বৈধ :

'XY' -> ('X', 'Y')
['X', 'Y'] -> ('X', 'Y')

যদি আপনি দেখতে পান যে কোনও মান আনপ্যাক করা হয়নি, তবে আপনি বিকল্পটি পূর্বাবস্থায় ফিরিয়ে আনবেন। (আরও ব্যাখ্যার জন্য নীচে দেখুন।)

এছাড়াও, যখন আপনি "নগ্ন" কমা দেখেন, ভান করে একটি শীর্ষ স্তরের টিপল রয়েছে। বাম এবং ডান উভয় দিকে এটি করুন (অর্থাত্ লিভালু এবং সমমানের জন্য ):

'X', 'Y' -> ('X', 'Y')
a, b -> (a, b)

এই সাধারণ নিয়মগুলি মাথায় রেখে এখানে কয়েকটি উদাহরণ দেওয়া হল:

(a,b), c = "XY", "Z"                 # a = 'X', b = 'Y', c = 'Z'

উপরে বিধি প্রয়োগ করা হচ্ছে, আমরা রূপান্তর "XY"করতে ('X', 'Y')ডান বন্ধনী, এবং নগ্ন কমা আবরণ:

((a, b), c) = (('X', 'Y'), 'Z')

এখানে ভিজ্যুয়াল চিঠিপত্রটি কার্যসাধনাটি কীভাবে কাজ করে তা মোটামুটি সুস্পষ্ট করে তোলে।

এখানে একটি ভ্রান্ত উদাহরণ রয়েছে:

(a,b), c = "XYZ"

উপরোক্ত প্রতিস্থাপনের নিয়ম অনুসরণ করে, আমরা নীচে পাই:

((a, b), c) = ('X', 'Y', 'Z')

এটি স্পষ্টতই ভ্রান্ত; নেস্টেড স্ট্রাকচারগুলি মেলে না। এখন আসুন দেখুন কীভাবে এটি আরও জটিল জটিল উদাহরণগুলির জন্য কাজ করে:

(a,b), c, = [1,2],'this'             # a = '1', b = '2', c = 'this'

উপরোক্ত নিয়ম প্রয়োগ করে আমরা পাই

((a, b), c) = ((1, 2), ('t', 'h', 'i', 's'))

তবে এখন এটি কাঠামো থেকে পরিষ্কার হয়েছে যে 'this'প্যাক করা হবে না, তবে সরাসরি নির্ধারিত c। সুতরাং আমরা বিকল্পটি পূর্বাবস্থায় ফিরিয়ে আছি।

((a, b), c) = ((1, 2), 'this')

এখন দেখা যাক আমরা cএকটি টিপলে গুটিয়ে রাখি তখন কী হয় :

(a,b), (c,) = [1,2],'this'           # ERROR -- too many values to unpack

হয়ে

((a, b), (c,)) = ((1, 2), ('t', 'h', 'i', 's'))

আবার, ত্রুটি সুস্পষ্ট। cআর একটি নগ্ন ভেরিয়েবল নয়, তবে একটি অনুক্রমের অভ্যন্তরে একটি পরিবর্তনশীল, এবং ডানদিকে একই সিকোয়েন্সটি প্যাকযুক্ত (c,)। তবে সিকোয়েন্সগুলির একটি পৃথক দৈর্ঘ্য রয়েছে, সুতরাং একটি ত্রুটি আছে।

*অপারেটরটি ব্যবহার করে এখন বাড়ানো আনপ্যাকিংয়ের জন্য । এটি কিছুটা জটিল, তবে এটি এখনও মোটামুটি সোজা। এর আগে একটি পরিবর্তনশীল *একটি তালিকায় পরিণত হয়, যার সাথে সম্পর্কিত অনুক্রমের যে কোনও আইটেম রয়েছে যা ভেরিয়েবল নামগুলিতে বরাদ্দ করা হয় না। মোটামুটি সহজ উদাহরণ দিয়ে শুরু:

a, *b, c = "X...Y"                   # a = 'X', b = ['.','.','.'], c = 'Y'

এটি হয়ে যায়

(a, *b, c) = ('X', '.', '.', '.', 'Y')

এটি বিশ্লেষণের সহজতম উপায় হ'ল প্রান্ত থেকে কাজ করা। 'X'নিযুক্ত করা হয় aএবং 'Y'নিযুক্ত করা হয় c। অনুক্রমের বাকী মানগুলি একটি তালিকায় রাখে এবং নির্ধারিত হয় b

লভ্যালুগুলি উপরোক্তগুলির পছন্দ (*a, b)এবং (a, *b)কেবল বিশেষ ক্ষেত্রে। আপনার *একটি লভালু ক্রমের ভিতরে দুটি অপারেটর থাকতে পারে না কারণ এটি অস্পষ্ট। মানগুলি এইরকম কিছুতে যাবে (a, *b, *c, d)- ইন bবা - c? আমি নেস্টেড কেসটি মুহুর্তে বিবেচনা করব।

*a = 1                               # ERROR -- target must be in a list or tuple

এখানে ত্রুটি মোটামুটি স্ব-ব্যাখ্যামূলক। লক্ষ্যটি ( *a) অবশ্যই একটি টিউপলে থাকবে।

*a, = (1,2)                          # a = [1,2]

এটি একটি নগ্ন কমা আছে কারণ এটি কাজ করে। নিয়ম প্রয়োগ করা হচ্ছে ...

(*a,) = (1, 2)

যেহেতু অন্য কোনও ভেরিয়েবল নেই *a, *aতাই মূল্যের অনুক্রমের সমস্ত মান স্লাপ করে। আপনি যদি (1, 2)একক মান দিয়ে প্রতিস্থাপন করেন ?

*a, = 1                              # ERROR -- 'int' object is not iterable

হয়ে

(*a,) = 1

আবার এখানে ত্রুটিটি স্ব-ব্যাখ্যামূলক। আপনি এমন কিছু আনপ্যাক করতে পারবেন না যা ক্রম *aনয় এবং আনপ্যাক করার জন্য কিছু দরকার। সুতরাং আমরা এটি একটি ক্রম স্থাপন

*a, = [1]                            # a = [1]

যা প্রতিদ্বন্দ্বী

(*a,) = (1,)

অবশেষে, এটি বিভ্রান্তির একটি সাধারণ বিষয়: (1)একইরকম 1- একটি গাণিতিক বিবৃতি থেকে একটি টিপলকে আলাদা করার জন্য আপনার কমা প্রয়োজন।

*a, = (1)                            # ERROR -- 'int' object is not 

এখন বাসা বাঁধার জন্য। আসলে এই উদাহরণটি আপনার "নিস্টেড" বিভাগে ছিল না; সম্ভবত আপনি বুঝতে পারলেন না যে এটি বাসা বেঁধেছে?

(a,b), *c = 'XY', 2, 3               # a = 'X', b = 'Y', c = [2,3]

হয়ে

((a, b), *c) = (('X', 'Y'), 2, 3)

শীর্ষ স্তরের টিউপলের প্রথম মান নির্ধারিত হয় এবং শীর্ষ স্তরের টিপল ( 2এবং 3) এর অবশিষ্ট মানগুলি বরাদ্দ করা হয় c- ঠিক যেমনটি আমাদের প্রত্যাশা করা উচিত।

(a,b),c = 1,2,3                      # ERROR -- too many values to unpack
*(a,b), c = 1,2,3                    # a = 1, b = 2, c = 3

প্রথম লাইনে একটি ত্রুটি কেন ছুঁড়েছে আমি ইতিমধ্যে উপরে ব্যাখ্যা করেছি। দ্বিতীয় লাইনটি নির্বোধ তবে এটি কেন কাজ করে তা এখানে:

(*(a, b), c) = (1, 2, 3)

পূর্বে বর্ণিত হিসাবে, আমরা প্রান্ত থেকে কাজ করি। 3অ্যাসাইন করা হয় cএবং তারপরে অবশিষ্ট মানগুলি *পূর্বের সাথে ভেরিয়েবলের জন্য বরাদ্দ করা হয় , এই ক্ষেত্রে (a, b),। সুতরাং এটি সমান (a, b) = (1, 2), যা কাজ করে কারণ উপাদানগুলির সঠিক সংখ্যা রয়েছে। ওয়ার্কিং কোডে এটি কখন প্রদর্শিত হবে এমন কোনও কারণ আমি ভাবতে পারি না। একইভাবে,

*(a, *b), c = 'this'                 # a = 't', b = ['h', 'i'], c = 's'

হয়ে

(*(a, *b), c) = ('t', 'h', 'i', 's')

প্রান্ত থেকে কাজ করা হয়, 's'বরাদ্দ করা হয় cএবং ('t', 'h', 'i')নির্ধারিত হয় (a, *b)। প্রান্ত থেকে আবার কাজ করা, 't'বরাদ্দ করা হয়েছে a, এবং ('h', 'i')খ হিসাবে তালিকা হিসাবে নির্ধারিত হয়েছে। এটি আর একটি নির্বোধ উদাহরণ যা কখনই কার্যকারী কোডে প্রদর্শিত হবে না।


24
যেহেতু ওপি একটি দীর্ঘ তালিকার উদাহরণ দিয়েছে, এটি কেবলমাত্র উপযুক্ত যে আপনি ব্যাখ্যাগুলির একটি দীর্ঘ তালিকা দিন।
জন ওয়াই

7

পাইথন 2 টিউপলকে আনপ্যাকিং করা বেশ সোজা find বাম দিকের প্রতিটি নাম একটি সম্পূর্ণ ক্রম বা ডানদিকে একটি ক্রমের একক আইটেমের সাথে মিলে যায়। যদি নামগুলি কোনও অনুক্রমের একক আইটেমের সাথে মিলে যায়, তবে আইটেমগুলির সমস্ত কভার করার জন্য পর্যাপ্ত নাম অবশ্যই থাকতে হবে।

প্রসারিত আনপ্যাকিংটি অবশ্য বিভ্রান্তিকর হতে পারে, কারণ এটি এত শক্তিশালী। বাস্তবতা হ'ল আপনার দেওয়া শেষ 10 বা ততোধিক বৈধ উদাহরণগুলি কখনই করা উচিত নয় - যদি ডেটাটি সেই কাঠামোগত হয় তবে এটি dictতালিকার মতো কাঠামোগত ফর্ম নয়, কোনও বা শ্রেণীর উদাহরণে থাকা উচিত ।

স্পষ্টতই, নতুন সিনট্যাক্সটি অপব্যবহার করা যেতে পারে। আপনার প্রশ্নের উত্তর হ'ল আপনাকে এ জাতীয় মত প্রকাশ করতে হবে না - এগুলি খারাপ অভ্যাস এবং আমি সন্দেহ করি সেগুলি ব্যবহার করা হবে।

আপনি ইচ্ছামত জটিল এক্সপ্রেশন লিখতে পারেন তার অর্থ আপনার উচিত নয়। আপনি কোড লিখতে পারে map(map, iterable_of_transformations, map(map, iterable_of_transformations, iterable_of_iterables_of_iterables))কিন্তু আপনি না


দ্রষ্টব্য: আমি এরকম কোড লিখেছি, বেশ কয়েকটি স্তর আরও জটিল। এটি কেবল একটি অনুশীলন হিসাবে লক্ষ্য করা হয়েছিল এবং পুরো জ্ঞানের সাথে করা হয়েছিল যে তিন মাস পরে এটি আমার কাছে অর্থহীন হবে এবং এটি অন্য কারও কাছে বোধগম্য হবে না । যদি আমার ঠিক মনে থাকে তবে এটি বহুভুজ পরীক্ষায় পয়েন্টটি কার্যকর করেছিল, কিছু সমন্বিত রূপান্তর করেছিল এবং কিছু এসভিজি, এইচটিএমএল এবং জাভাস্ক্রিপ্ট তৈরি করেছিল।
agf '

3

আমি মনে করি আপনার কোডটি প্রকাশের জন্য অন্য ফর্মটি বিভ্রান্তিকর হতে পারে।

এটি অপারেটরদের অগ্রাধিকার সম্পর্কে প্রশ্ন এড়াতে এক্সপ্রেশনে অতিরিক্ত বন্ধনী ব্যবহার করার মতো। আমি আপনার কোডটি পঠনযোগ্য করে তোলার জন্য সর্বদা একটি ভাল বিনিয়োগ।

আমি কেবল সোয়াপ এর মতো সাধারণ কাজের জন্য আনপ্যাকিং ব্যবহার করতে পছন্দ করি।

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