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

כן צודק- בקריאה שניה של התרגיל נראה לי שהכוונה בשילוב היא שאם הקובץ האחרון לא קיים יש ליצור אותו, או אם כל אחד מהקבצים האחרים לא קיים יש להציג שגיאה

פתרון תרגיל 1 בנושא קבצים

import sys
import os

path = "C:\\Python\\files_3\\"

path_w = path + sys.argv[len(sys.argv)-1]

for file in range(1,len(sys.argv)-1):
    path_r = path + sys.argv[file]
    if not os.path.isfile(path_r):
        sys.exit("File doesn't exist")
        
    with open(path_r,"r") as f_r:
        with open(path_w,"a") as f_w:
            
            for line in f_r:
                f_w.write(line)
            f_w.write("\n")

הי הי,

יש פיצ׳ר נחמד בפייתון שחוסך את ה \ הכפול במחרוזות באמצעות הוספת האות r לפני המחרוזת. במילים אחרות:

path = r"C:\Python\files_3\"

יעבוד לך טוב ויהיה יותר נעים לעין.

דבר נוסף לגבי הלולאה שלך אני הייתי כותב אותה קצת אחרת:

for file in [path + name for name in sys.argv[1:-1]:
  # now file is already path_r
  if not os.path.isfile(file):
    sys.exit("...")

הי,
פתרון תרגיל 2 בנושא קבצים

import sys
import os
from itertools import izip_longest

path = "C:\\Python\\files_3\\"
if len(sys.argv) != 4: sys.exit("Usage: %s <file1.txt> <file2.txt> <file3.txt>" % sys.argv[0])
path_1 = path + sys.argv[1]
path_2 = path + sys.argv[2] 
path_3 = path + sys.argv[3]

with open(path_1,"r") as file1, open(path_2,"r") as file2:
    with open(path_3,"a") as file3:
        for line1, line2 in izip_longest(file1, file2):
            if line1 is not None:
                if line1[-1] != "\n":line1 += "\n"
                file3.write(line1)
                
            if line2 is not None:
                if line2[-1] != "\n":line2 += "\n"
                file3.write(line2)

ניסיתי לכתוב כפי שהצעת: "\path = r"C:\Python\files_3
אך קיבלתי הודעת שגיאה

  File "targil_2.py", line 5
    path = r "C:\Python\files_3\"
                                ^
SyntaxError: EOL while scanning string literal
לייק 1

אויש נכון זה לא עובד על ה \ האחרון…

עוד אפשרות זה להשתמש בלוכסן קדימה:

path = r'C:/Python/files_3/'

פתרון תרגיל 3 בנושא קבצים

import csv
import sys

numbers = 0
path = "C:\\Python\\files_3\\"
path_csv = path + sys.argv[1]
with open(path_csv,"rb") as file:
    reader = csv.reader(file)
    rows = [int(row[1]) for row in reader]
    numbers = sum(rows) 
    print numbers

הי,
נסיתי את מה שעשית בסרטון פייתון ועברית אצלי במחשב - ללא הצלחה
כאשר ניסיתי להדפיס “שלום לכולם” זה מה שיצא:

וכשניסיתי לשמור זאת בקובץ זה מה שיצא:

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

לבסוף , כשנסיתי את התוכנית המבקשת קלט מהמשתמש - זה עבד אך כשהזנתי שם בעברית למסך קיבלתי אותו בסימני שאלה במקום בעברית…

תודה , עמיר

תוכל לנסות להפעיל את התוכנית בקובץ המצורף וספר מה היא מדפיסה?

amir.py (81 בתים)

במחשב בעבודה (WIN 7) היא מדפיסה את זה

ובמחשב בבית (WIN 10) התוצאה היתה הדפסה אך במקום “שלום לכולם” היא הדפיסה סימני שאלה

הי,
להלן פתרון תרגיל 1 בנושא מבני נתונים. (אשמח להתייחסותך לתרגיל 3 בנושא קבצים ששלחתי לעיל (: )

User_pass_dic = {'apple':'red','lettuce':'green','lemon':'yellow','orange':'orange'}
user_pass_list = [] 

for i in ['Username','Password']:
	user_pass_list.append(raw_input('enter %s: ' % i))
if user_pass_list[0] in User_pass_dic and User_pass_dic[user_pass_list[0]] == user_pass_list[1]:
    print 'Welcome Master'
else:
    print 'INTRUDER ALERT'

שבת שלום וסופ"ש נעים :slight_smile:

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

ולגבי העברית אמשיך לבדוק נשמע שמשהו בהגדרות המסוף בווינדוס לא מדויק אחפש ואעדכן

לייק 1

תיקון (מבני נתונים)

User_pass_dic = {'apple':'red','lettuce':'green','lemon':'yellow','orange':'orange'} 

username = raw_input('Enter Username: ')
password = raw_input('Enter Password: ')

if username in User_pass_dic and User_pass_dic[username] == password:
    print 'Welcome Master'
else:
    print 'INTRUDER ALERT'
לייק 1

עכשיו בוא נדבר שניה על שמות משתנים. אותה תוכנית עם שמות אחרים:

saved_password = {'apple':'red','lettuce':'green','lemon':'yellow','orange':'orange'} 
valid_users = saved_password.keys()

username = raw_input('Enter Username: ')
password_from_user = raw_input('Enter Password: ')

if username in valid_users and password_from_user == saved_password[username]
    print 'Welcome Master'
else:
    print 'INTRUDER ALERT'

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

פתרון תרגיל 2 (מבני נתונים)

import sys

average = 0
sum = 0

for i in sys.argv[1:]:
    sum += int(i)  
average = sum / len(sys.argv[1:])
for i in sys.argv[1:]:
    if int(i) > average:
        print i,

פתרון תרגיל 3 (מבני נתונים)

import sys

pc_id ={}
with open ('C:\\Python\\data_4\\pc_id.txt','r') as file:
   for line in file:
       k,v = line.split('=') 
       pc_id[k] = v 

for item in sys.argv[1:]:
   if item in pc_id:
       print pc_id[item] 
   else:
       print 'your PC: {} is not in the list'.format(item)

הי,

כמה הערות:

  1. לא נהוג לקרוא למשתנה בשם sum מאחר ויש כבר פונקציה בשפה בשם זה.

  2. כדאי לשמור את הערכים אחרי ההמרה ל int ברשימה חדשה, ואז לא תצטרך להמיר אותם ל int פעם שניה בלולאה השניה.

  3. תרגיל 3 - מעולה!

פתרון תרגיל 4 (מבני נתונים)

from collections import Counter
import sys

ref = {}
words_list =[]
to_print = []
path = sys.argv[1]

with open(path,'r') as anagram:
    for line in anagram:
        words_list.append(line.strip())
    for index,word in enumerate(words_list):
        for element in words_list[index+1:]:
            if len(element) == len(word):
                e = Counter(element)
                w = Counter(word)    
                for k,v in e.items():
                    if  k in w.keys() and w[k] == v:
                        ref[k] = w[k]
                if ref == w:
                    to_print.append('{} {}'.format(element,word))  
                    ref = {}
                elif word not in to_print:
                    to_print.append(word)
                               
for i in to_print:
    print i

קצת מסורבל… אולי אפשר לסדר את הקוד בפונקציות שיהיה יותר קל לקרוא?

עוד לא הגענו לפונקציות…