পাইথনে আমি কীভাবে ওরফে সদস্য ফাংশন করব?


23

পাইথনে, বার বার ব্যবহৃত ফাংশনগুলি এলিয়জ করে কেউ বাইট সংরক্ষণ করতে পারে। উদাহরণ স্বরূপ:

r=range
a=r(100)
b=r(200)
c=r(300)

যাইহোক, যখন ফাংশনগুলি একসাথে সদস্য ফাংশন হয়, তখন আমি জানি না যে কীভাবে শৃঙ্খলা মঞ্জুরি দেয় এমন উপায়ে তাদের কীভাবে উলামাভ করব। উদাহরণ স্বরূপ:

s='Hello'

// Plain code
s=s.replace('H','J').replace('e','i').replace('l','m').replace('o','y')

// What I am trying to do
q=replace
s=s.q('H','J').q('e','i').q('l','m').q('o','y')

স্পষ্টতই, আমি যা করার চেষ্টা করছি তা বৈধ নয়। এবং এটিও নয়:

q=s.replace
s=q('H','J') // Replaces the 'H' in 'Hello'
s=q('e','i') // Replaces the 'e' in 'Hello'... and the J is gone.
s=q('l','m')
s=q('o','y')

চরিত্রগুলি সংরক্ষণ করে ওরফে সদস্য ফাংশন এবং শৃঙ্খলযুক্ত ফাংশনগুলির কি অন্য উপায় আছে?


আপনার নিজস্ব ক্লাসটি সংজ্ঞায়িত করুন, এর পদ্ধতিটির qঅর্থ যা replaceক্লাসে আপনার ব্যবহারের অর্থ।
Ypnypn

3
আমি আনন্দিত যে এটিকে
হ্রাস

2
আমি আপাতত সমস্ত উত্তর অদৃশ্য করে দিয়েছি, তবে আমরা এই জাতীয় অনুরূপ প্রশ্নগুলির জন্য উউইকি-ইনিংয়ের আহ্বান জানাতে এতটা দৃ enough় sensকমত্যে পৌঁছতে পারি নি। আরও দেখুন: meta.codegolf.stackexchange.com/q/1555/3808
Doorknob

3
এখন যেহেতু পূর্বোক্ত মেটা আলোচনাটি আধিকারিক (বা আমাদের মধ্যে বেশিরভাগ একমত), আমি এগিয়ে গিয়ে এই পোস্টটিতে উইকি সরিয়েছি।
ডুরকনব

1
আপনার শেষ সংস্করণটি কাজ করে না। qনির্দিষ্ট strউদাহরণের প্রতিস্থাপন পদ্ধতিতে আবদ্ধ । এছাড়াও, মনে রাখবেন যে আপনি একক চর প্রতিস্থাপনটি করতে পারেন"Hello".replace(*"HJ")
gnibbler

উত্তর:


28

কোন সমস্যা নেই! আপনি কোনও পদ্ধতি উপকরণ করতে পারেন, তবে এটি কীভাবে ব্যবহার করবেন তা আপনাকে জানতে হবে:

>>> r=str.replace
>>> a='hello'
>>> r(r(r(r(a,'h','j'),'e','i'),'l','m'),'o','y')
'jimmy'

মূলটি হ'ল আপনাকে selfস্পষ্টভাবে পাস করতে হবে , কারণ উপনামটি একধরণের ফাংশন যা অতিরিক্ত যুক্তি গ্রহণ করে যা গ্রহণ করে self:

>>> type(r)
<type 'method_descriptor'>

3
এর আগে আমি কীভাবে দেখিনি?
রেইনবোল্ট

6

একটি স্বল্প পদ্ধতির নাম সহ আপনার নিজস্ব শ্রেণি সংজ্ঞা দিন।

উদাহরণস্বরূপ, যদি আপনি পদ্ধতি ব্যবহার করে করছি replace()একাত্মতার Stringবর্গ, আপনি করতে পারে আপনার নিজস্ব বর্গ Sএকটি পদ্ধতি বলা আছে qযা একই জিনিস আছে।

এখানে একটি বাস্তবায়ন:

class m(str):
 def q(a,b,c):return m(a.replace(b,c))

এখানে আরও কার্যকর বাস্তবায়ন:

class m(str):q=lambda a,b,c:m(a.replace(b,c))

এটি এর মতো ব্যবহার করুন:

s="Hello"
s=m(s).q('H','J').q('e','i').q('l','m').q('o','y')

5

এটি যাইহোক কিছু অক্ষর সংক্ষিপ্ত

j=iter('HJeilmoy')
for i in j:s=s.replace(i,next(j))

এমনকি সংখ্যক প্রতিস্থাপনের জন্যও ছোট

for i in['HJ','ei','lm','oy']:s=s.replace(*i)

অবশ্যই এটি কেবল একটি বিশেষ কেস জুড়ে। তবে কোড গল্ফ সেই সমস্ত বিশেষ কেসগুলি সন্ধান করা যা আপনার বাইটগুলি সংরক্ষণ করতে পারে।

জেনারেল কেস পরিচালনা করে এমন একটি মোড়ক ফাংশন লেখা সম্ভব, তবে বেশিরভাগ কোড গল্ফ চ্যালেঞ্জগুলিতে স্থান পাওয়ার জন্য কোডটি খুব বড় হবে।

এর পরিবর্তে আপনার ভাবার দরকার আছে "স্ট্রিয়ার রিলেসিসের সাথে দক্ষতার সাথে (স্ট্রোকের দিক দিয়ে) এই রূপান্তরটি আমি করতে পারি that এর সুবিধা নেওয়ার জন্য আমি কি আমার সমাধানের অভ্যন্তরীণ উপস্থাপনাটি বদলাতে পারি? (সুবিধাটিকে তুচ্ছ করার জন্য এতগুলি স্ট্রোক নষ্ট না করে)"


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

4

আপনি reduceফাংশন ব্যবহার করতে পারেন ।

reduce(lambda s,(a,b):s.replace(a,b),[('H','J'),('e','i'),('l','m'),('o','y')],'Hello')

থেকে আপনার উত্তর বিভিন্ন তাহলে এই উত্তর (যতদূর কৌশল ব্যবহার করা যেমন, অগত্যা লিপিবদ্ধ সঠিক একই ফর্ম)?
রেইনবোল্ট

1
@ রাশার এটি ভিন্ন। উদাহরণস্বরূপ, অনুরোধের উত্তরটি সংযুক্ত উত্তরে কঠোর কোডিং করা হয়েছে যদিও এখানে এটি কেবল দ্বিতীয় যুক্তির দৈর্ঘ্য দ্বারা দেওয়া হয়েছে (যা কোনও পুনরাবৃত্তিকারী হতে পারে)।
হাওয়ার্ড

1

আপনি যদি অনেকগুলি প্রতিস্থাপন করেন তবে আপনি এটি করতে পারেন:

s=''.join({'H':'J','e':'i','l':'m','o':'y'}[a] for a in list(s))

আমি এমন একটি উত্তরের প্রত্যাশা করছিলাম যা প্রতিস্থাপনের জন্য নির্দিষ্ট ছিল না। আমি এটি উদাহরণ হিসাবে ব্যবহার করেছি।
রেইনবোল্ট

এটি একবারে 1 টি চর প্রতিস্থাপন করতে পারে তবে এটি মাল্টি-চার প্রতিস্থাপন সন্নিবেশ করতে পারে। এবং এটি পুরোপুরি গল্ফ হয় না (এর পরে স্থানটি সরিয়ে ফেলুন [a])
জাস্টিন

2
এর সাথে কি [a]প্রতিস্থাপন করতে হবে না .get(a,a)(অন্যথায়, আমরা কিছু কী ত্রুটিযুক্ত জিনিস পাই)? আর এর list(s)বদলে কেন s?
জাস্টিন

1

কিভাবে একটি ল্যাম্বডা ফাংশন সংজ্ঞায়িত সম্পর্কে?

r=lambda s,a,b:s.replace(a,b)

s=r(r(r(r(s,'H','J'),'e','i'),'l','m'),'o','y')

1
প্রয়োজন নেই: str.replace/ হয় / যে ল্যাম্বদা! আমার উত্তর দেখুন।
এমটিএনভিউমার্ক

1

যদি আপনার প্রতিস্থাপনগুলি শৃঙ্খলিত করার প্রয়োজন না হয় তবে আপনি 'স্ট্রিং ট্রান্সলেট' ব্যবহার করতে পারেন। নম্বরগুলি হ'ল এএসসিআইআই অধ্যাদেশ। এটি এভাবে ব্যবহার করার জন্য পাইথন 3 প্রয়োজন:

print("Hello".translate({72:74,101:105,108:109,111:121}))

এটি অনলাইনে চেষ্টা করুন

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