שיחה:פייתון/פייתון גרסה 2/פונקציות
הדגשים כאן לא נראים לי
עריכהנראה לי מוזר קצת שהפוקנציות הראשונות המוצגות כאן מטפלות במטה-דאטה (סוגי משתנים, המרות, וכו').Thedsadude 18:13, 26 בנובמבר 2007 (IST)
התאמה לשאר הפרקים
עריכהמאז יצירת דף זה הוספתי כעשרה דפים חדשים, שונים מאוד באופיים מהדף הנוכחי. אני מתכוון לשנות את התוכן בו כך שיתאים לשאר הדפים. לדעתי הדף, כפי שהוא, אינו תורם רבות לתלמיד השפה: הדגש איננו בפשטות על הטכניקה והמטרה של כתיבת פונקציות. Thedsadude 21:22, 28 בנובמבר 2007 (IST)
העתקת התוכן משפת C/פונקציות
עריכההתוכן של הפרק בC נראה לי טוב יותר. לדעתי, קל יותר להמיר את התוכן שלו להתאמה לפייתון, מאשר לשפר את התוכן המקורי. אגב, אם כותב התוכן המקורי מבקר כאן, אתה מוזמן לדון על זה בדף השיחה כאן. Thedsadude 17:38, 12 בדצמבר 2007 (IST)
- טוב, עשיתי זאת, פחות או יותר. Thedsadude 19:38, 12 בדצמבר 2007 (IST)
סוגריים מסולסלים בפונקציה?
עריכהציטוט: מייד לאחר שם הפונקציה צריכים להופיע סוגריים שבהם תכתב רשימת הפרמטרים שהפונקציה תקבל. גם אם הפונקציה לא מקבלת פרמטרים עדיין יש לכתוב את הסוגריים. לאחר הסוגריים ייפתחו סוגריים מסולסלים שמציינים את תחילת קטע הקוד של הפונקציה, ובסוף הפונקציה יופיעו סוגריים מסולסלים נוספים שסוגרים אותה.
כאשר בגוף ההדגמה הסוגריים המסולסלות כלל לא נמצאות ובפרט שהודגש בתחילת הספר שבפייתון ההזחה מסמלת את בלוק הקוד ולא סוגריים
לא ערכתי בפנים כיוון שאין לי נסיון מעשי בשלב זה ולא רציתי להטעות מי שמתכנת בפייתון מוזמן לבצע עריכה לטקסט
- אתה צודק. תודה. Thedsadude 17:20, 13 באפריל 2008 (IDT)
by val ו-by ref (או שאף אחד מהם...)
עריכהאהלן. כתבתי פונקציה שמקבלת מטריצה A ווקטור b, שניהם מטיפוס numpy.ndarray ופותרת מערכת תלת אלכסונית. אני מקבל תוצאות זהות לאלו של linalg.solve, כלומר האלגוריתם נכון. אבל יש לי בעיה אחרת: כל הרצה של הפונקציה שלי, הוקטור b משתנה. בעקרון אני משתמש בפנים באות b לצרכים אחרים אך לעניות דעתי מדובר במשתנה לוקלי. בכל אופן, רציתי לדעת אם יש איזה משהו שאני אולי מפספס... תודה! (הקוד מצורף)
from numpy import *
def Thomas_Algorithm(A,b):
# Input: A matrix (full NxN or band-storage), b vector.
# Output: x, the solution of Ax=b.
N=len(A)
M=len(A[0])
if (M==3) and (N>3):
return Thomas_Band(A,b)
elif N==M:
return Thomas_Sparse(A,b)
else:
return None
def Thomas_Sparse(A,b):
# Input: A full NxN matrix.
# For internal use only.
# Output: Band-stored matrix.
N=len(A)
M=len(A[0])
A_band=zeros([N,3])
A_band[0,1]=A[0,0]; A_band[0,2]=A[0,1]
A_band[N-1,0]=A[N-1,N-2]; A_band[N-1,1]=A[N-1,N-1]
for i in range(1,N-1): # i=1..N-2
for j in range(3): # j=0,1,2
A_band[i,j]=A[i,i+j-1]
return Thomas_Band(A_band,b)
def Thomas_Band(A,d):
# Assumptions: A[0,0]=0 (a_1)
# A[N,2]=0 (c_N)
N=len(A)
M=len(A[0])
x=zeros(N) # x[0], x[1],..., x[N-1]
for i in range(1,N): # Skip first index, i=1..N-1
a=A[i,0]; b=A[i,1]; c=A[i-1,2] # a_i, b_i, c_{i-1}
factor=a/A[i-1,1] # a_i/beta_{i-1}
A[i,1]=b-factor*c
d[i]=d[i]-factor*d[i-1]
A[i,0]=0 # That's "a_i"
x[i]=d[i]/A[i,1] # i=N-1 after the loop
for i in range(N-2,-1,-1): # i=N-2, N-3,..., 0
x[i]=(d[i]-A[i,2]*x[i+1])/A[i,1]
return x
Mintz l 00:20, 7 ביולי 2008 (IDT)
- שלום ידידי,
- כפי שמוסבר בפייתון/במקום משתנים - עצמים ושמות, אין משתנים בפייתון. ממילא, אין שום שאלה של משתנים לוקאליים, העברת פרמטרים כזאת או אחרת - כל זה זר לפייתון לחלוטין.
- מה קורה כאן? אתה קורא לפונקציה הראשונה עם איזשהו עצם (וקטור, במקרה זה). השם b מקושר לעצם. אם היא קוראת לפונקציה השלישית, אזי השם d מקושר לעצם שאליו קושר b (כלומר הוקטור המקורי). כל שינוי שאתה מבצע בעצם שאליו מקושר d, הוא זהה לחלוטין לשינוי בעצם המקורי. הייתי מציע שתבדוק איך בnumpy מעתיקים וקטור (שזה כלל לא אותו הדבר כמו לקשר שם נוסף לאותו עצם הוקטור).
- אם אינך מסתדר, אנא כתוב שוב.
- ביי,
- Thedsadude 22:54, 7 ביולי 2008 (IDT)
- שלום. לאור דבריך, הדוגמה הבאה מפתיעה אותי:
>>> a=3
>>> b=a
>>> b=4
>>> a
3
>>> b
4
- שכן הייתי מצפה ש-a יכיל את 4... מה בין זה לבין הקוד הקודם? תודה. Mintz l 23:18, 12 ביולי 2008 (IDT)
משוב מ-6 במרץ 2016
עריכהאם כבר מניעת שיכפולים, מה לגבי שימוש בפונקציית הדפסה במקום שכפול של השורה:
print str(c) + ' in Celsius is ' + str( celsius_to_fahrenheit(c) ) + ' in Fahrenheit'