שיחה:פייתון/פייתון גרסה 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'