פורסם: 22/06/2015 - 21:36
נושא ההודעה: פייתון: מספר שאלות לגבי תנאי בשורה אחת
|
לדוגמה יש לי את הקוד הבא
אני מעוניין להריץ לולאה כלשהי כל עוד הערך שנכנס הוא לא XYZ, במידה והוא כן שהלולאה תגלד על האיטרציה הנוכחית ותעבור לאיטרציה הבאה.
הבעיה היא שאי אפשר להכניס continue בתוך הelse.
קוד: |
a = []
for i in range(10):
print i if i % 2 == 0 else continue
a.append(i)
File "<ipython-input-9-09a143bb89a4>", line 3
print i if i % 2 == 0 else continue
^
SyntaxError: invalid syntax
|
שאלה אחרת שיש לי היא אם ניתן לעשות תנאי בשורה אחת בלי להתחייב לעשות else בסוף.
קוד: |
a = []
for i in range(10):
a = 'lalalala' if i % 2 == 0
File "<ipython-input-12-d350d6ae2777>", line 3
a = 'lalalala' if i % 2 == 0
^
SyntaxError: invalid syntax
|
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 21:46
נושא ההודעה:
|
אתה מדבר כאן על conditional expression. למעשה הביטוי
קוד: |
x if condition else y
|
מתרגם לערך בודד - x אם התנאי אמת, אחרת y. במקרה הראשון הבעיה היא ש-continue הוא לא ערך ש-print יודע להדפיס. במקרה השני - מה יהיה הערך אם התנאי לא מתקיים?
ראה גם https://docs.python.org/2.5/whatsnew/pep-308.html
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 22:25
נושא ההודעה:
|
בעיקרון אתה צודק אבל יש אפשרות כן לעשות את זה רק בצורה לא פייתונית, אני שואל אם יש משהו שכן "מותר" לעשות
קוד: |
a = []
for i in range(10):
i % 2 == 0 and a.append(i)
print a
[0]
[0]
[0, 2]
[0, 2]
[0, 2, 4]
[0, 2, 4]
[0, 2, 4, 6]
[0, 2, 4, 6]
[0, 2, 4, 6, 8]
[0, 2, 4, 6, 8]
|
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 22:35
נושא ההודעה:
|
זאת תשובה לשאלה המקורית, או תגובה להסבר?
בכל מקרה - מה אתה מנסה לעשות? למה לא לעשות את זה עם list comprehension?
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 22:39
נושא ההודעה:
|
SF : | זאת תשובה לשאלה המקורית, או תגובה להסבר?
בכל מקרה - מה אתה מנסה לעשות? למה לא לעשות את זה עם list comprehension? |
מסביר את הבעיה שלי (זה לא פייתוני)
בקשר לשאלה השניה מה שאני עושה זה עובר על קובץ עם המון שורות ומפרסר אחת אחת, יש שורות שמראש אני לא רוצה לפרסר אותם ולכן אני זקוק לדלג על האיטרציה.
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 22:54
נושא ההודעה:
|
מה הבעיה עם משהו כמו
קוד: |
for line in lines:
if line_condition:
continue
...process lines...
|
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 22:56
נושא ההודעה:
|
אתה לא מתייחס לזה נכון, זה לא דרך אחרת לרשום ל-if/else (כלומר control structure) אלא ביטוי ternary.
בשפות אחרות הייתה רושם:
קוד: | i = condition ? true_value : false_value; |
זה חייב להיות משהו שאפשר להציב.
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 23:00
נושא ההודעה:
|
אוקי את השאלה הראשונה הבנתי
מה בקשר לשניה למה אי אפשר לעשות continue רק אם התנאי מתקיים?
גם הדבר הבא לא עובד.
קוד: |
for i in range(10):
continue if i % 2 == 0
print a |
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 23:16
נושא ההודעה:
|
אם שאלת את זה, לא הבנת. ביטוי ternary משמש להצבה, אין קשר בינו למשהו כמו continue.
קוד: |
if i %% 2 == 0:
continue |
או לחלופין ללא continue:
קוד: |
for x in y:
if i % 2 != 0:
process_line() |
באופן אישי לא הייתי כותב זאת כך, אלא כותב generator שמקבל את זה של הקובץ ומחזיר רק את השורות המתאימות, ועליו הייתי עושה את האיטרציה בתור פונקציה או בתור generator expression - אם התנאי לא מורכב מדי והוא יהיה קריא. אופן עבודה כזה הוא פייתוני יותר לטעמי.
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 23:17
נושא ההודעה:
|
קוד: |
def b():
print "y"
[b() for x in range(0,10) if x%2==0]
|
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 22/06/2015 - 23:23
נושא ההודעה:
|
עדיף לך generator expression ולא list comprehension.
|
|
חזרה לתוכן הדיון |
פורסם: 29/06/2015 - 17:27
נושא ההודעה:
|
תודה רבה לכולם
|
|
חזרה לתוכן הדיון |
|