אתחול לולאת while

בקוד שאני מנסה לעשות, יש כמה מקרים בהם שחקן בוחר שחקן מרשימה.
אני רוצה לוודא שהשחקן הנבחר הוא לא השחקן הבוחר.
בגדול הייתי כותבת משהו כזה:

הקוד

choose = random.choice(players)
while choose == self:
choose = random.choice(players)

אבל מרגישה שיש פה שכפול קוד מיותר (השורה הראשונה והשורה השלישית).
האם יש לכם הצעה אחרת?

את יכולה אולי לאתחל את זה עם None.
אומר את זה בהנחה שהתכוונת while choose != self

דווקא התכוונתי ==…

אוקיי עכשיו נראה לי שהבנתי אותך.
לא מצליח לחשוב על דרך נורמלית לחסוך את הקוד הכפול, את יכולה לאתחל אותו לself אבל אז אנחנו בעצם תמיד נכנסים לwhile כשעם הקוד הכפול שיש עכשיו את מונעת את זה ברוב הפעמים.

לייק 1

פשוט תעשי קופי לרשימה בעזרת המתודה, ותוציאי אותו מהרשימה המועתקת, ותבחרי משם…

לייק 1

תודה.
תוהה אם זה עדיף מבחינה רעיונית.

זה מאוד לא יעיל כי בגדול יש הסתברות שהשחקן שיצא בהגרלה הוא השחקן הבוחר יותר מפעם אחת ואז סתם יש הרצות מיותרות.

הייתי מציע לחלץ אותו מהרשימה ואז לבחור ממנה בפעם אחת.

That what I have just said. :pensive:

להרחבה, נסי לקרוא על walrus operator (:
(תצטרכי לשדרג לפייתון 3.8 כדי להשתמש בזה)

4 לייקים

לא בדיוק כי אני לא אמרתי לעשות קופי (;

זה העלה לי פלאשבק לפסקל … יש שם סימון כזה := אם אני לא טועה

מה שכן, זה עדין לא פותר את הענין החזרתיות במידה ומוגרל משתנה זהה … :mask:

נראה לי שיש כמה אפשרויות - שתיים שחשבתי עליהן:

פrandom.choices ולחלק משקלים בהתאם (1 לכולם, 0 לself) (הייתי מסתכלת שוב על מבחר האפשרויות בתיעוד של random, אולי יש עוד אופציות מגניבות)

אפשר להגדיר רשימה חדשה לבחירה או לטפל ברשימה הזו לפני ואחרי

לא יודעת לגבי יעילות…

לייק 1

אז למה בדיוק התכוונת? פשוט להוציא אותו מהרשימה? הוא עדיין חלק מרשימת השחקנים, אי אפשר פשוט להוציא אותו…

טכנית אפשר להוציא אותו, בעזרת המתודה pop ואז גם הוא ישמר וגם תהא לך רשימה בלעדיו, ולאחר שתבחרי תוכלי להחזיר אותו.
בכ"מ שבוע טוב לכולם :slight_smile:

לייק 1

תודה! אם אני אשדרג לפייתון 3.8 זה יפגע לי איכשהו בתכנות בקורס?

אני לא יכול לרשום את התשובה אבל זה לא משהו שלא למדנו (: