পাইথন ২.7-এ প্রিন্ট স্বেচ্ছাসেবায় বন্ধনী কেন?


98

পাইথন ২.7 এ নিম্নলিখিত উভয় একই কাজ করবে

print("Hello, World!") # Prints "Hello, World!"

print "Hello, World!" # Prints "Hello, World!"

তবে নিচেরটি হবে না

print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")

print "Hello,", "World!" # Prints the words "Hello, World!"

পাইথন 3.x প্রথম বন্ধনী চালু printকরা বাধ্যতামূলক, এটি মূলত এটি একটি ফাংশন তৈরি করে তবে ২.7 এ উভয়ই পৃথক ফলাফলের সাথে কাজ করবে। printপাইথন ২.7 এ আমার আর কী জানা উচিত ?


7
পাইথন ২.x printএ আসলে একটি বিশেষ বিবৃতি, কোনও ফাংশন নয়। এটিও এ কারণেই ব্যবহার করা যায় না: lambda x: print xদ্রষ্টব্য যে (expr)কোনও টিপল তৈরি করে না (এটি ফলাফল করে expr) তবে ,তা করে does

আমি একটি ফাংশন হিসাবে মুদ্রণের জন্য সমর্থন ধরে নিচ্ছি এবং একটি বিবৃতি হিসাবে মুদ্রণ হ'ল পাইথনের পুরানো সংস্করণগুলির সাথে পিছনের সামঞ্জস্যতা বজায় রাখা যখন লোকেরা অজগর 3 এর দিকে মাইগ্রেশন করতে নতুন সিনট্যাক্স ব্যবহার করতে উত্সাহিত করে
জিডাব্লুডাব্লু

11
PS, ২. 2.-এ মুদ্রণ ফাংশন সক্ষম করতে (এবং মুদ্রণের বিবরণী আচরণ না করে), আপনাকে ভবিষ্যতের আমদানি করতে হবে:from __future__ import print_function
জেফ মার্কাডো

দ্বিতীয় উদাহরণটি কি আসলে "হ্যালো, ওয়ার্ল্ড!" প্রিন্ট করবে? (স্থান ছাড়াই) বা এটি "হ্যালো, ওয়ার্ল্ড!" প্রিন্ট করবে (স্থান সহ) উদাহরণ হিসাবে।
কাপাড

উত্তর:


107

পাইথন ২.x printএ আসলে একটি বিশেষ বিবৃতি এবং কোনও ফাংশন নয় *।

এটি এ কারণেই ব্যবহার করা যায় না: lambda x: print x

নোট যে (expr)একটি টিপল তৈরি করে না (এটি ফলাফল expr), কিন্তু ,না। এটি সম্ভবত পাইথন ২.7 এর মধ্যে print (x)এবং এর print (x, y)মধ্যে বিভ্রান্তির সৃষ্টি করে

(1)   # 1 -- no tuple Mister!
(1,)  # (1,)
(1,2) # (1, 2)
1,2   # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

যাইহোক, যেহেতু পাইথন ২.x printএ একটি বিশেষ সিনট্যাক্স স্টেটমেন্ট / ব্যাকরণ তৈরি করা হয়েছে, তখন বন্ধনী ছাড়া এটি ,একটি বিশেষ পদ্ধতিতে আচরণ করে - এবং একটি টুপল তৈরি করে নাprintবিবৃতিটির এই বিশেষ চিকিত্সা এটির পিছনে ,বা না থাকলে আলাদাভাবে কাজ করতে সক্ষম করে ।

শুভ কোডিং।


printপাইথন 2 এর এই ব্যবহারটি পাইথন 3-তে পরিবর্তন করা যেতে পারে:

from __future__ import print_function

4
(expr) != tupleব্যাখ্যার জন্য ধন্যবাদ :-)
হুব্রো

5

এটি সমস্ত খুব সহজ এবং সামনের বা পিছনের সামঞ্জস্যের সাথে কিছুই করার নেই।

printসংস্করণ 3 এর আগে সমস্ত পাইথন সংস্করণে বিবৃতিটির সাধারণ ফর্মটি হ'ল:

print expr1, expr2, ... exprn

(পরিবর্তে প্রতিটি অভিব্যক্তি মূল্যায়ন করা হয়, একটি স্ট্রিং এ রূপান্তরিত হয় এবং তাদের মধ্যে একটি ফাঁক দিয়ে প্রদর্শিত হয়।)

তবে মনে রাখবেন যে একটি এক্সপ্রেশনটির চারপাশে বন্ধনী স্থাপন করা এখনও একই অভিব্যক্তি।

সুতরাং আপনি এই হিসাবে এটি লিখতে পারেন:

print (expr1), (expr2), ... (expr3)

ফাংশন কল করার সাথে এর কোনও যোগসূত্র নেই।


এটি পুরোপুরি সঠিক উত্তর, আমি নিশ্চিত নই কেন এটি এতটা কেন হ্রাস পেয়েছে।
মার্টিজন পিটারস

এটি সম্পর্কে নয় print (expr1), (expr2), ... (expr3), print (expr1, expr2, ... , expr3)পাইথন ২.x বৈধ কেন, এটি 2.x মান অনুযায়ী হওয়া উচিত নয় about
বিনফ

5

এটি ইউটিএফ -8 এ আসে আমাদের আকর্ষণীয় পার্শ্ব প্রতিক্রিয়া আছে।

>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek['dog'], greek['cat']
σκύλος γάτα
>> print (greek['dog'], greek['cat'])
('\xcf\x83\xce\xba\xcf\x8d\xce\xbb\xce\xbf\xcf\x82', '\xce\xb3\xce\xac\xcf\x84\xce\xb1')

শেষ মুদ্রণটি হেক্সাডেসিমাল বাইট মানগুলির সাথে টিপল।


7
আমি ধরে নিলাম কারণ মুদ্রণটি ইউটিএফ -8 সঠিকভাবে প্রিন্ট করে, তবে এটি যখন আপনার শেষ প্রিন্টের মতো একটি টুপল পায়, তখন এটি চলতে reprথাকে, এমন সময়ে এটি সম্ভবত ডেস্কের সমস্ত স্ট্রিংকে এএসসিআইআইতে এনকোড করে।
হুব্রো

4
@Codemonkey, আপনি সঠিক চলেছেন repr । আপনি ASCII সম্পর্কে ভুল। পাইথনের জন্য ASCII ডিফল্ট এনকোডিং। তবে পাইথন স্ক্রিপ্টের শুরুতে আমার আছে #encoding=utf-8, লিনাক্স এনভিও LANG=en_US.UTF-8। সুতরাং পুনরায় এনকোডগুলি ডিফল্ট ASCII ব্যবহার না করে utf-8 এনকোডিং করুন।
কার্লো স্মিড

4
strবিশেষ string_escapeএনকোডিং সহ পুনরায় এনকোডগুলি । স্ট্রিংটি ইউটিএফ -8 হিসাবে ইতিমধ্যে ইউনিকোড এনকোড হয়েছে।
tzot

@KarloSmid: আমি কি বলতে বোঝানো ছিল reprসম্ভবত তা নিশ্চিত করার জন্য টেক্সট পদক্ষেপ নেয় পারেন (অ-হওয়া ASCII প্রতীক পলায়নের মাধ্যমে) হওয়া ASCII দ্বারা উপস্থাপিত করা যেতে, অগত্যা না যে স্ট্রিং হয় হওয়া ASCII হিসাবে এনকোডেড। আমি এখনও জানি না যদিও এটি সম্পূর্ণ সঠিক কিনা I
হুব্রো

সমস্ত পাইথন পাত্রে (তালিকা, ডিক্ট, টিপল, সেট) repr()স্ট্রিংয়ে রূপান্তরিত হওয়ার সময় তাদের সামগ্রীগুলি আউটপুট হিসাবে অন্তর্ভুক্ত করে (তারা __str__কেবল প্রয়োগ করে না __repr__)। আপনি যা দেখছেন তা ইউটিএফ -8 এর জন্য বিশেষ নয়; repr()একটি স্ট্রিং আপনার বৈধ পাইথন স্ট্রিং লিটারেল যে হওয়া ASCII-নিরাপদ দেয়।
মার্টিজন পিটারস

2

মূলত পাইথন 3 এর আগে পাইথন-এ, মুদ্রণ একটি বিশেষ বিবৃতি ছিল যা আর্গুমেন্ট হিসাবে পাওয়া গেলে সমস্ত স্ট্রিং মুদ্রিত করে। সুতরাং print "foo","bar"কেবল "বার" দ্বারা "মুদ্রণ 'ফু' বোঝানো হয়েছে। যে সঙ্গে সমস্যা এটি কাজ করতে যেন মুদ্রণ একটি ফাংশন ছিল প্রলুব্ধকর ছিল, এবং পাইথন ব্যাকরণ যে দ্ব্যর্থক, যেহেতু (a,b)একটি tuple ধারণকারী হয় aএবং bকিন্তু foo(a,b)দুই আর্গুমেন্ট এর একটি ফাংশন আহবান।

সুতরাং প্রোগ্রামগুলিকে কম অস্পষ্ট এবং আরও নিয়মিত করার জন্য তারা 3 টির জন্য বেমানান পরিবর্তন করেছেন।

(আসলে, আমার কাছে মনে হয় ২. এর সাথে ২.6 এর মতো আচরণ করে তবে আমি নিশ্চিত নই।)


না এটি কোনও ফাংশন হিসাবে ব্যবহার করার জন্য "লোভনীয়" ছিল না। :) তবে এটি একটি ফাংশন হিসাবে ব্যবহার করা অসম্ভব, সুতরাং আপনি উদাহরণ হিসাবে উদাহরণের জন্য [প্রিন্ট x এক্স করতে পারবেন না]।
লেনার্ট রেজেব্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.