একটি প্রসেস এক্স টাইমস চালানোর আরও পাইথোনিক উপায়


90

বেশি পাইথোনিক কোনটি?

লুপ করার সময়:

count = 0
while count < 50:
    print "Some thing"
    count = count + 1

লুপের জন্য:

for i in range(50):
    print "Some thing"

সম্পাদনা: অনুলিপি করা হয়নি কারণ এর মধ্যে পরিষ্কার রয়েছে কিনা তা নির্ধারণের উত্তর রয়েছে, বনাম 'i' ছাড়াই কীভাবে একটি পরিসীমা চালানো যায় - যদিও এটি সবচেয়ে মার্জিত হয়ে ওঠে


8
নীচের ভোটগুলি ক্ষতিপূরণ দেওয়ার জন্য পদক্ষেপ নেওয়া: লিওনেল যদি এই প্রশ্নটি জিজ্ঞাসা করে তবে অন্যদেরও একই প্রশ্ন থাকতে পারে এবং নীচের উত্তরগুলি কার্যকর হবে।
এরিক হে লেবিগোট

4
শব্দ "পাইথোনিক" অতিরিক্ত ব্যবহার করা হচ্ছে। এটি "পঠনযোগ্য" এবং "সহজেই বোধগম্য" এর সমার্থক শব্দ। পাইথনে, কমপক্ষে।
darioo

উত্তর:


112

ব্যক্তিগতভাবে:

for _ in range(50):
    print "Some thing"

আপনার যা দরকার তা না হলে i। আপনি যদি পাইথন <3 ব্যবহার করেন এবং আপনি অনেকবার লুপটি পুনরাবৃত্তি করতে চান তবে xrangeআগেই পুরো তালিকাটি তৈরি করার দরকার নেই বলে ব্যবহার করুন ।


15
যদিও গেটেক্সটেক্স ট্রান্সলেশন ফাংশনে ম্যাপ করা হচ্ছে _ এর জন্য নজর রাখুন।
জিনতাউস মিলিয়াউসকাস

এই উত্তরের জন্য ধন্যবাদ; আমি লুপটি ব্যবহার না করার মূল কারণ এটি ছিল কারণ "আই" তে আমার একটি অব্যবহৃত পরিবর্তনশীল ছিল।
লিওনেল

6
_ ঠিক অন্যান্য ভেরিয়েবলের মতো like এটি কেবল আরইপিএলে রয়েছে যে এর কোনও বিশেষ তাত্পর্য রয়েছে। ওপি পাশাপাশি থাকতে পারে i
ভিজুল্ট

4
@ অ্যাজভাল্ট আমি এটি পছন্দ করি কারণ এটি স্পষ্ট করে দেয় যে পরিবর্তনশীলটি বিবৃতিতে ব্যবহৃত হচ্ছে না। এমন কোনও কারণ রয়েছে যা এটির সাথে আবদ্ধ হওয়ার জন্য এটিকে ছাপিয়ে যায় i?
ryanjdillon

6
আমি পনিগুলি যুক্ত করার দৃ a় বিশ্বাসী, স্বতঃস্ফূর্তভাবে যখন উপযুক্ত মনে হয় ... পনি পরিসীমা (50) এর জন্য: মুদ্রণ ("ত্রি") # পিতা 3
পল

3

লুপটি অবশ্যই স্পষ্টতই বেশি পাইথোনিক, কারণ এটি আপনি কী আরও স্পষ্টভাবে এবং সংক্ষিপ্তভাবে করছেন তা বোঝানোর জন্য কার্যক্ষমতায় নির্মিত পাইথনের উচ্চ স্তরের ব্যবহার করে। ভেরিলোগের iবক্তব্যের মতো বিবৃতিটির অনুপস্থিতি থেকে রেঞ্জ বনাম এক্সরেঞ্জের ওভারহেড এবং একটি অব্যবহৃত পরিবর্তনশীল নির্ধারণ করা repeat। পরিসীমা সমাধানের জন্য স্থির থাকার প্রধান কারণ হ'ল অন্যান্য উপায়গুলি আরও জটিল। এই ক্ষেত্রে:

from itertools import repeat

for unused in repeat(None, 10):
    del unused   # redundant and inefficient, the name is clear enough
    print "This is run 10 times"

এখানে পরিসরের পরিবর্তে পুনরাবৃত্তি ব্যবহার করা কম স্পষ্ট কারণ এটি কোনও ফাংশন ততটা সুপরিচিত নয় এবং আরও জটিল কারণ আপনার এটি আমদানি করতে হবে। আপনার যদি কোনও রেফারেন্সের প্রয়োজন হয় তবে প্রধান স্টাইল গাইডগুলি হলেন পিইপি 20 - পাইথনের জেন এবং পিইপি 8 - পাইথন কোডের জন্য স্টাইল গাইড

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


বারবার জিনিস সরাসরি ব্যবহার করা কি ভাল হবে না, অর্থাৎ: for s in repeat('This is run 10 times', 10): print s??
এফ

নিশ্চয়ই! তবে নমুনা কোডের মুদ্রণটি কোডের পুনরাবৃত্ত বিভাগের কেবল উদাহরণ ছিল, যার জন্য কোনও কেন্দ্রীয় অবজেক্ট নাও থাকতে পারে।
ইয়ান ভার্নিয়ার

পাইথন কোর বিকাশকারী বলেছেন যে এটি range() টুইটার.
com

এটি প্রকৃতপক্ষে দ্রুত, কারণ এটি intপ্রতিটি পুনরাবৃত্তির জন্য আলাদা আলাদা অবজেক্ট সন্ধান করা বা তৈরি করার প্রয়োজন নেই । যাইহোক, প্রোগ্রামার সময় এক্সিকিউশন সময়ের চেয়ে মূল্যবান হতে পারে।
ইয়ান ভার্নিয়ার

2

আপনি যদি লুপের মধ্যে ঘটে এমন পার্শ্ব প্রতিক্রিয়াগুলির পরে থাকেন তবে আমি ব্যক্তিগতভাবে এই range()পদ্ধতির জন্য যাব ।

আপনি যদি লুপের মধ্যে কল করেন এমন ফাংশনগুলির ফলাফলের বিষয়ে যত্নশীল হন তবে আমি একটি তালিকা বোধ বা mapপদ্ধতির জন্য যাব । এটার মতো কিছু:

def f(n):
    return n * n

results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))

ফলাফল = (এফের জন্য রেঞ্জের জন্য (50))
লুকা রাহনে

4
ফলাফল = itertools.imap (চ, পরিসীমা (50))
লুকা রাহনে

@ralu, কেবলমাত্র যদি ফলাফলগুলিতে আপনাকে বারবার বা এলোমেলো অ্যাক্সেসের প্রয়োজন না হয়।
অ্যারোনস্টার্লিং

4
ফলাফল = টিউপল (ফলাফল) এবং তালিকার চেয়ে দ্রুততর, যেহেতু
টুপলে টুকরো টুকরো টুকরো

-3

কেমন?

while BoolIter(N, default=True, falseIndex=N-1):
    print 'some thing'

বা আরও কুরুচিপূর্ণভাবে:

for _ in BoolIter(N):
    print 'doing somthing'

বা যদি আপনি শেষ সময়টি ধরে ধরতে চান তবে:

for lastIteration in BoolIter(N, default=False, trueIndex=N-1):
    if not lastIteration:
        print 'still going'
    else:
        print 'last time'

কোথায়:

class BoolIter(object):

    def __init__(self, n, default=False, falseIndex=None, trueIndex=None, falseIndexes=[], trueIndexes=[], emitObject=False):
        self.n = n
        self.i = None
        self._default = default
        self._falseIndexes=set(falseIndexes)
        self._trueIndexes=set(trueIndexes)
        if falseIndex is not None:
            self._falseIndexes.add(falseIndex)
        if trueIndex is not None:
            self._trueIndexes.add(trueIndex)
        self._emitObject = emitObject


    def __iter__(self):
        return self

    def next(self):
        if self.i is None:
            self.i = 0
        else:
            self.i += 1
        if self.i == self.n:
            raise StopIteration
        if self._emitObject:
            return self
        else:
            return self.__nonzero__()

    def __nonzero__(self):
        i = self.i
        if i in self._trueIndexes:
            return True
        if i in self._falseIndexes:
            return False
        return self._default

    def __bool__(self):
        return self.__nonzero__()

-5

কোনও কিছুর পুনরাবৃত্তি করার সত্যিই অজগর উপায় নেই। তবে এটি একটি ভাল উপায়:

map(lambda index:do_something(), xrange(10))

আপনার যদি সূচকটি পাস করতে হয় তবে:

map(lambda index:do_something(index), xrange(10))

বিবেচনা করুন যে এটি সংগ্রহ হিসাবে ফলাফলগুলি প্রদান করে। সুতরাং, যদি ফলাফলগুলি সংগ্রহ করতে হয় তবে এটি সহায়তা করতে পারে।


কেবল এটিই আরও ভাল নয় (ফাংশন কল ওভারহেড, কম পরিচিত ল্যাম্বডা এক্সপ্রেশন, একটি তালিকায় অব্যবহৃত ফলাফল সংগ্রহ করা), 10 পুনরাবৃত্তিযোগ্য নয়।
ইয়ান ভার্নিয়ার

হ্যাঁ, এক্সরেঞ্জ (10) নয় 10। আমি বলেছি এটি ভাল কারণ আপনার কোনও ফাংশন লিখতে বা লুপ তৈরি করার দরকার নেই। তবে, যেমনটি আমি বলেছিলাম আসল পাইথোনিক উপায় নেই। আমি কোড পরিবর্তন করেছি, ধন্যবাদ।
আবী ​​এম.সঙ্গারব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.