בקוד שאני מנסה לעשות, יש כמה מקרים בהם שחקן בוחר שחקן מרשימה.
אני רוצה לוודא שהשחקן הנבחר הוא לא השחקן הבוחר.
בגדול הייתי כותבת משהו כזה:
הקוד
choose = random.choice(players)
while choose == self:
choose = random.choice(players)
אבל מרגישה שיש פה שכפול קוד מיותר (השורה הראשונה והשורה השלישית).
האם יש לכם הצעה אחרת?
Dusinka
את יכולה אולי לאתחל את זה עם None.
אומר את זה בהנחה שהתכוונת while choose != self
Rach
דווקא התכוונתי ==…
Dusinka
אוקיי עכשיו נראה לי שהבנתי אותך.
לא מצליח לחשוב על דרך נורמלית לחסוך את הקוד הכפול, את יכולה לאתחל אותו לself אבל אז אנחנו בעצם תמיד נכנסים לwhile כשעם הקוד הכפול שיש עכשיו את מונעת את זה ברוב הפעמים.
לייק 1
zurikarat
פשוט תעשי קופי לרשימה בעזרת המתודה, ותוציאי אותו מהרשימה המועתקת, ותבחרי משם…
לייק 1
Rach
תודה.
תוהה אם זה עדיף מבחינה רעיונית.
aviadamar
זה מאוד לא יעיל כי בגדול יש הסתברות שהשחקן שיצא בהגרלה הוא השחקן הבוחר יותר מפעם אחת ואז סתם יש הרצות מיותרות.
הייתי מציע לחלץ אותו מהרשימה ואז לבחור ממנה בפעם אחת.
zurikarat
That what I have just said.
Yam
להרחבה, נסי לקרוא על walrus operator (:
(תצטרכי לשדרג לפייתון 3.8 כדי להשתמש בזה)
4 לייקים
aviadamar
לא בדיוק כי אני לא אמרתי לעשות קופי (;
aviadamar
זה העלה לי פלאשבק לפסקל … יש שם סימון כזה := אם אני לא טועה
מה שכן, זה עדין לא פותר את הענין החזרתיות במידה ומוגרל משתנה זהה …
devorack
נראה לי שיש כמה אפשרויות - שתיים שחשבתי עליהן:
פrandom.choices ולחלק משקלים בהתאם (1 לכולם, 0 לself) (הייתי מסתכלת שוב על מבחר האפשרויות בתיעוד של random, אולי יש עוד אופציות מגניבות)
אפשר להגדיר רשימה חדשה לבחירה או לטפל ברשימה הזו לפני ואחרי
לא יודעת לגבי יעילות…
לייק 1
Rach
אז למה בדיוק התכוונת? פשוט להוציא אותו מהרשימה? הוא עדיין חלק מרשימת השחקנים, אי אפשר פשוט להוציא אותו…
zurikarat
טכנית אפשר להוציא אותו, בעזרת המתודה pop ואז גם הוא ישמר וגם תהא לך רשימה בלעדיו, ולאחר שתבחרי תוכלי להחזיר אותו.
בכ"מ שבוע טוב לכולם
לייק 1
Rach
תודה! אם אני אשדרג לפייתון 3.8 זה יפגע לי איכשהו בתכנות בקורס?
aviadamar
אני לא יכול לרשום את התשובה אבל זה לא משהו שלא למדנו (: