השוואת פיתרונות קורס Python

הי,

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

פתרון לתרגיל 6:

"""The program choose randomally
2 numbers between 1 - 10 and print the 
minimum divided number by both of them"""

result = 0
from random import randint
num1 = randint(1,10)
num2 = randint(1,10)
print "num1 is {} and num2 is {}".format(num1,num2)
if num1 == num2:
    result = 2 * num1
    print result
elif num1 > num2:
    if num2 == 1:
        result = 2 * num1
        print result
    else:

        for i in range(2,num2+1):
            if (i * num1) % num2 == 0:
                result = i * num1
                print result
                break
else:
    if num1 == 1:
        result = 2 * num2
        print result
    else:
        for i in range(2,num1 +1):
            if (i * num2) % num1 == 0:
                result = i * num2
                print result
                break

הי,

נראה לי שאנחנו משתפרים עם הפורום (וגם עם הפייתון)

עדיין כמה נקודות:

  1. כל פקודות ה import צריכות להיות בתחילת התוכנית (לפני שורת הקוד הראשונה).

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

הי,
הלכתי עם מה שהצעת ולהלן תוכנית חלופית:

from random import randint
num1 = randint(1,10)
num2 = randint(1,10)
print "num1 is {} and num2 is {}".format(num1,num2)

result = num1 * num2
result_1 = result
for i in range(result-1, max(num1,num2),-1):
    if i % num1 == 0 and i % num2 == 0:
        result_1 = i
print result_1

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

אתה תמיד יכול לעצור צעד אחד קודם ואז המספרים עצמם לא ייכנסו לחישוב (אם הבנתי נכון את ההערה שלך)

בכל מקרה נראה לי שאת הקוד החדש הרבה יותר קל להבין

תרגיל מס’ 7:

"""The program choose randomally
one number between 1 - 100 and ask 
 the user to guess the number"""

from random import randint
num = randint(1,100)
while True:
    guess = int(raw_input("Enter your guess: "))
    if float (num) / guess == 1 and float (num) % guess == 0:break
    if float (num) / guess >1:
        print "too small"
    else:
        print "too big"
print "Bingo (: Your guess {} fit to the chosen number -  {}".format(guess,num)

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

הי,

במערכות הפעלה מסוג Unix הפקודה ls מציגה את רשימת הקבצים בתיקיה. בחלונות הפקודה המקבילה משורת הפקודה היא dir. ואגב אפשר להתקין את כל כלי שורת הפקודה של לינוקס גם על חלונות 10 למשל דרך המדריך הזה:

(אם אתה אוהב משחקים מסוג זה… כמובן לא הכרחי לקורס)

לגבי פיתרון 7 לא הבנתי את המשחקים עם החלקי והמודולו… התכוונת לבדוק אם המספרים שווים או שאני מפספס משהו?

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

if num == guess :break
לייק 1

סליחה על השאלה אבל אני עוד לא מומחה בשורת הפקודה.
אני פשוט לא מצליח להגיע לתיעוד ע"י pydoc כמו שהראית בסרטון.
אני כותב pydoc raw_input למשל, אך מקבל הודעת שגיאה.
אני רוצה להגיע לתיעוד של המודולים os ו sys בשורת הפקודה
לא ממש מצליח…
אני צריך להגיע לספריה מסויימת ומשם לכתוב pydoc? או אולי בדרך אחרת?
יש לי win 7
תודה

הי,

נדמה לי שדיברנו על זה באחד המיילים… בכל מקרה כותב פה ואחרי זה יהיה יותר קל למצוא. משורת הפקודה אפשר לכתוב:

python -m pydoc raw_input

וזה עובד גם בחלונות

הי ינון,
יש לי כמה שאלות בנוגע למודול os:
א. מה ההבדל בין הצגה רקורסיבית של הקבצים ע"י os.walk לבין הצגתם ע"י os.listdir?
כלומר מה פירוש בצורה רקורסיבית?

ב. בקטע הבא:

for root,dirs,files in os.walk('/etc'):
    for name in files:
        if os.access(name, os.W_OK):
            print "File is writable: %s/%s" % (root,name)

הפונקציה os.W_OK היא משהו שמור בפייתון לגבי הרשאת כתיבה?
מה לגבי שאר המשתנים? האם הם אקראיים או גם שמורים?

ג. בקטע הבא:

for name in os.listdir("."):
    if name.endswith(".txt"):
        newname = name[:-3] + "old"
        print "Renaming %s => %s" % (name,newname)

מה בדיוק ההבדל בין os.walk לבין os.listdir ? למה כשמשתמשים ב os.walk צריכים את כל הנתיב ואילו ב os.listdir מספיק לכתוב רק (".") ? אתה אומר בסרטון שכך אתה מגיע לתיקיה הנוכחית אבל לא ממש הבנתי איך מגיעים לכל קובץ וקובץ בלי כל הנתיב.

ד. בסרטון אתה יוצר קבצים ע"י שורת הפקודה באמצעות הפקודה touch. זה גם משהו ששייך ל UNIX? כי בחלונות זה לא עובד לי. (אתה משתמש גם ב python us - לא הבנתי לצורך מה).

ה. בסוף התוכנית כתבת את השורה:

os.rename(name,newname)

אני הבנתי שע"י הקטע הקודם (שהדבקתי בסעיף ג) החלפת שמות הקבצים כבר נעשתה. לכן לא הבנתי מה os.rename עושה בעצם?

תודה מראש, עמיר

הי הי,

אנסה לענות אחת אחת…

א. הצגת קבצים רקורסיבית הכוונה שאם אחד הנתיבים הוא תיקיה יוצגו גם הקבצים והתיקיות שבתוך התיקיה וכך הלאה (כלומר לכל עומק העץ). בהצגה רגילה (עם os.listdir) אם אחת התוצאות היא תיקיה פשוט יוצג שם התיקיה.

ב. אם עשית import למודול אז כל השמות שמתחילים בשם המודול מגיעים ממנו. כלומר השם os.W_OK מגיע מהמודול os. וכך גם לגבי מודולים אחרים שכבר ראינו. לעומתם השמות root, dirs ו files הם שמות חדשים שיוצרים משתנים מקומיים ולכן אין חשיבות מיוחדת לשם זה או אחר.

ג. גם ב os.walk אפשר להתחיל עם נקודה. ההבדל הוא ש os.listdir ייתן רק את התוצאות מהתיקיה שביקשת, ואילו os.walk ייתן את התוצאות בצורה רקורסיבית לכל עומק העץ (כלומר אם אחד הדברים בתיקיה הנוכחית הוא תיקיה אז os.walk ייכנס גם אליה ו os.listdir יוותר ויציג רק את שמה).

ד. כן גם הפקודה touch שייכת ליוניקס. אולי בסוף הקורס תשתכנע שיוניקס זה כיף ותחליט להתקין :slight_smile: (יש גם קורס לינוקס באתר כתוכנית המשך)

ה. לא לא. הקטע מסעיף ג רק מדפיס למסך שהוא מתכנן להחליף שם קובץ. הפקודה os.rename היא שמחליפה את שם הקובץ בפועל.

לייק 1

תודה רבה על התשובות המפורטות !
רק לגבי סעיף ד, איך אני יוצר קבצים בשורת הפקודה? האם יש בחלונות פקודה מקבילה ל touch?

בוא ננסה משהו יותר נחמד: נסה לכתוב סקריפט פייתון בשם touch.py שתוכל להפעיל משורת הפקודה ושיצור קובץ כמו ש touch עשתה

תרגול מודולים תרגיל 1:

import sys

number = 1
if len(sys.argv) >1:
    number = int(sys.argv[1])
    for i in range(number):
        print "Hello World"
else:
    print "Usage: %s <number>" % sys.argv[0]
לייק 1

לבקשתך :grinning::
סקריפט שיוצר קובץ ע"י הפקודה touch

import sys

new_file = ''
if len(sys.argv) == 2 and sys.argv[1] == "touch":
    

    while True:
        new_file = raw_input()
        if new_file == '':break
        path = r"C:\Python\modules_2\%s" % new_file

        new_file = open (path,"w")

לא כדאי - שים לב שבסרטון השתמשתי ב touch משורת הפקודה וישירות בשורת הפקודה העברתי את שמות הקבצים (כפרמטרים).

בנוסף כדאי לבדוק קודם אם הקובץ קיים כדי לא לדרוס קבצים קיימים

לא הבנתי.
גם אני משתמש ב touch משורת הפקודה (אחרי python touch.py אני מקליד touch)
ולאחר מכן - בשורת הפקודה - אני כותב את שם הקובץ , כשבמקביל אני פותח את התיקיה הרלוונטית ורואה שהקובץ אכן נפתח.
לא הבנתי מה לא כדאי