本文目錄一覽:
- 1、用Python3實現表達式求值
- 2、Python該怎麼入門?
- 3、分析以下python程序中endings=[‘st’,’nd’,’rd’]+17*[‘th’]+[‘st’,’nd’,’rd’]+7*[‘th’]+[‘st’]有啥作用?
用Python3實現表達式求值
include malloc.h #include stdio.h #include ctype.h//判斷是否為字元的函數的頭文件 #define maxsize 100 typedef int elemtype; typedef struct sqstack sqstack;//由於sqstack不是一個類型 而struct sqstack才是 char ch[7]=;//把符號轉換成一個字元數組 int f1[7]=;//棧內元素優先順序 int f2[7]=;//棧外的元素優先順序 struct sqstack { elemtype stack[maxsize]; int top; }; void Initstack(sqstack *s) { s-top=0; } void Push(sqstack *s,elemtype x) { if(s-top==maxsize-1) printf(“Overflow\n”); else { s-top++; s-stack[s-top]=x; } } void Pop(sqstack *s,elemtype *x) { if(s-top==0) printf(“underflow\n”); else { *x=s-stack[s-top]; s-top–; } } elemtype Gettop(sqstack s) { if(s.top==0) { printf(“underflow\n”); return 0; } else return s.stack[s.top]; } elemtype f(char c) { switch(c) { case ‘+’: return 0; case ‘-‘: return 1; case ‘*’: return 2; case ‘/’: return 3; case ‘(‘: return 4; case ‘)’: return 5; default: return 6; } } char precede(char c1,char c2) { int i1=f(c1); int i2=f(c2);//把字元變成數字 if(f1[i1]f2[i2])//通過原來設定找到優先順序 return ”; else if(f1[i1]f2[i2]) return ”; else return ‘=’; } int Operate(elemtype a,elemtype theta,elemtype b) { int sum; switch(theta) { case 0: sum=a+b; break; case 1: sum=a-b; break; case 2: sum=a*b; break; default: sum=a/b; } return sum; } EvaluateExpression() { char c; int i=0,sum=0; int k=1,j=1;//設置了開關變數 elemtype x,theta,a,b; sqstack OPTR,OPND; Initstack(OPTR); Push(OPTR,f(‘#’));//0壓入棧 Initstack(OPND); c=getchar(); if(c==ch[2]||c==ch[3]||c==ch[5]||c==ch[6])//先對+和-的情況忽略和左括弧的情況 { printf(“錯誤1 \n”); k=0; return 0; } if(c==ch[0]) c=getchar();//如果是+,把它覆蓋 if(c==ch[1]) { j=0; c=getchar();//也把-號覆蓋 } while(c!=’#’||ch[Gettop(OPTR)]!=’#’) { if(isdigit(c)) { sum=0; while(isdigit(c)) { if(!j) { sum=sum*10-(c-‘0’);//實現了數字串前面有負號(之前是:sum=-(sum*10)-(c-‘0’)結果是-12+13=21) } else sum=sum*10+(c-‘0′); c=getchar(); } Push(OPND,sum);//如果還是數字先不壓棧,把數字串轉化成十進位數字再壓棧 j=1; } else if(k) { switch(precede(ch[Gettop(OPTR)],c)) { case”: Push(OPTR,f(c));//把它們整型化 c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c==’\n’)//要除去下個是『(』的情況 也把以運算符歸到這裡來 { printf(“出錯2\n”); k=0; return 0;//加了開關變數和返回0的值使程序更以操作 } break; case’=’: Pop(OPTR,x); c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c==’\n’)//把ch[6]的情況也忽略了但此時並沒有注意到右括弧後面右運算符的情況 { printf(“出錯2\n”); k=0; return 0; } break; case”: Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a);//注意這裡是誰先出棧 Push(OPND,Operate(a,theta,b)); break; } } }//在這裡判斷是否以運算符結束是不對的 return(Gettop(OPND)); } main() { int result; printf(“輸入你的算術表達式:\n”); result=EvaluateExpression(); printf(“結果是 :%d\n”,result); return 0; } : 本計算器利用堆棧來實現。 1、定義後綴式計算器的堆棧結構 因為需要存儲的單元不多,這裡使用順序棧,即用一維數組來模擬堆棧: #define MAX 100 int stack[MAX]; int top=0; 因此程序中定義了長度為MAX的一維數組,這裡MAX用宏定義為常數100,我們可以修改宏定義而重新定義堆棧的大小。 整型數據top為棧頂指示,由於程序開始時堆棧中並無任何數據元素,因此top被初始化為0。 2、存儲後綴式計算器的運算數 我們定義了堆棧stack[MAX]後,就可以利用入棧操作存儲先後輸入的兩個運算數。 下面看一下是如何實現的: int push(int i) /*存儲運算數,入棧操作*/ { if(topMAX) { stack[++top]=i; /*堆棧仍有空間,棧頂指示上移一個位置*/ return 0; } else /*堆棧已滿,給出錯誤信息,返回出錯指示*/ { printf(“The stack is full”); return ERR; } } 我們在調用函數push時,如果它的返回值為0,說明入棧操作成功;否則,若返回值為ERR(在程序中說明為-1),說明入棧操作失敗。 3、從堆棧中取出運算數 當程序中讀完了四則運算符後,我們就可以從堆棧中取出已經存入的兩個運算數,構成表達式,計算出結果。取出運算數的函數採用的正是出棧演算法。在本例中,實現該演算法的函數 為pop(): int pop(); /*取出運算數,出棧操作*/ { int var; /*定義待返回的棧頂元素*/ if(top!=NULL) /*堆棧中仍有數據元素*/ { var=stack[top–]; /*堆棧指示下移一個位置*/ return var; } else /*堆棧為空,給出錯誤信息,並返回出錯返回值*/ printf(“The stack is cmpty!\n”); return ERR; } 同樣,如果堆棧不為空,pop()函數返回堆棧頂端的數據元素,否則,給出棧空提示,並返回錯誤返回值ERR。 4、設計完整的後綴式計算器 有了堆棧存儲運算數,後綴式計算器的設計就很簡單了。程序首先提示用戶輸入第一個運算數,調用push()函數存入堆棧中;而後提示用戶輸入第二個運算數,同樣調用push()函數存入堆棧中。接下來,程序提示用戶輸入+,-,*,/四種運算符的一種,程序通過switch_case結構判斷輸入運算符的種類,轉而執行不同的處理代碼。以除法為例,說明程序的執行流程: case ‘/’: b=pop(); a=pop(); c=a/b; printf(“\n\nThe result is %d\n”,c); printf(“\n”); break; 程序判斷用戶輸入的是除號後,就執行上述代碼。首先接連兩次調用pop()函數從堆棧中讀出先前輸入的運算數,存入整型數a和b中;然後執行除法運算,結果存入單元c中。這時需要考慮究竟誰是被除數,誰是除數。由於開始我們先將被除數入棧,根據堆棧「先進後出」的原則,被除數應該是第二次調用pop()函數得到的返回值。而除數則是第一次調用pop()函數得到的返回值。 最後程序列印出運算結果,並示提示用戶是否繼續運行程序: printf(“\t Continue?(y/n):”); l=getche(); if(l==’n’) exit(0); 如果用戶回答是”n”,那麼結束程序,否則繼續循環。 完整的程序代碼如下: #includestdio.h #includeconio.h #includestdlib.h #define ERR -1 #define MAX 100 /*定義堆棧的大小*/ int stack[MAX]; /*用一維數組定義堆棧*/ int top=0; /*定義堆棧指示*/ int push(int i) /*存儲運算數,入棧操作*/ { if(topMAX) { stack[++top]=i; /*堆棧仍有空間,棧頂指示上移一個位置*/ return 0; } else { printf(“The stack is full”); return ERR; } } int pop() /*取出運算數,出棧操作*/ { int var; /*定義待返回的棧頂元素*/ if(top!=NULL) /*堆棧中仍有元素*/ { var=stack[top–]; /*堆棧指示下移一個位置*/ return var; /*返回棧頂元素*/ } else printf(“The stack is empty!\n”); return ERR; } void main() { int m,n; char l; int a,b,c; int k; do{ printf(“\tAriothmatic Operate simulator\n”); /*給出提示信息*/ printf(“\n\tPlease input first number:”); /*輸入第一個運算數*/ scanf(“%d”,m); push(m); /*第一個運算數入棧*/ printf(“\n\tPlease input second number:”); /*輸入第二個運算數*/ scanf(“%d”,n); push(n); /*第二個運算數入棧*/ printf(“\n\tChoose operator(+/-/*//):”); l=getche(); /*輸入運算符*/ switch(l) /*判斷運算符,轉而執行相應代碼*/ { case ‘+’: b=pop(); a=pop(); c=a+b; printf(“\n\n\tThe result is %d\n”,c); printf(“\n”); break; case ‘-‘: b=pop(); a=pop(); c=a-b; printf(“\n\n\tThe result is %d\n”,c); printf(“\n”); break; case ‘*’: b=pop(); a=pop(); c=a*b; printf(“\n\n\tThe result is %d\n”,c); printf(“\n”); break; case ‘/’: b=pop(); a=pop(); c=a/b; printf(“\n\n\tThe result is %d\n”,c); printf(“\n”); break; } printf(“\tContinue?(y/n):”); /*提示用戶是否結束程序*/ l=getche(); if(l==’n’) exit(0); }while(1); } : #include stdio.h #include conio.h #include malloc.h #include stdlib.h #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; #define STACK_INIT_SIZE 100 //初始分配量 #define STACKINCREMENT 10 //存儲空間的分配增量 typedef char ElemType; typedef ElemType OperandType; //操作數 typedef char OperatorType; typedef struct { ElemType *base; ElemType *top; int stacksize; }SqStack; Status InitStack(SqStack S) { //構造一個空棧S S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status GetTop(SqStack S){ ElemType e; if (S.top == S.base) return ERROR; e = *(S.top-1); return e; } Status Push (SqStack S,ElemType e) { //插入元素e為新的棧頂元素 if (S.top – S.base = S.stacksize){ S.base = (ElemType *) realloc ( S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } Status Pop (SqStack S,ElemType e){ //若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR if(S.top == S.base) return ERROR; e = * –S.top; return OK; } char In(char c,char OP[]) { if(c=35 c=47) return 1; else return 0; } char OP[8]=; int m[7][7]={1,1,2,2,2,1,1, 1,1,2,2,2,1,1, 1,1,1,1,2,1,1, 1,1,1,1,2,1,1, 2,2,2,2,2,0,-1, 1,1,1,1,-1,1,1, 2,2,2,2,2,-1,0};//1 2 0 = -1 不存在 char Precede(char i,char j) { int a,b; char *p; for(p=OP,a=0;*p!=’\0′;p++,a++) if(*p==i) break; for(p=OP,b=0;*p!=’\0′;p++,b++) if(*p==j) break; if(m[a][b]==1) return ”; else if(m[a][b]==2) return ”; else if(m[a][b]==0) return ‘=’; else return ‘O’; } char Operate(char a,char theta,char b) { if(a47) a=atoi(a); if(b47) b=atoi(b); switch(theta) { case ‘+’: return a+b; break; case ‘-‘: return a-b; break; case ‘*’: return a*b; break; case ‘/’: return a/b; break; } } OperandType EvaluateExpression() { SqStack OPTR,OPND; OperandType a,b,c; OperatorType theta; InitStack(OPTR); Push(OPTR,’#’); InitStack(OPND); c=getchar(); while (c!=’#’ || GetTop(OPTR)!=’#’) { if (!In(c,OP)) else switch(Precede(GetTop(OPTR),c)) { case ” : Push(OPTR,c); c = getchar(); break; case ‘=’ : Pop(OPTR,c); c = getchar(); break; case ” : Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; } } return GetTop(OPND); } void main() { printf(“(以#為結束符)\n”); printf(“請輸入:\n”); int a; a=(int)EvaluateExpression(); printf(“%d”,a); getch(); } : ls都正確 : C++ In Action這本書裡面有表達式求值的詳細項目分析. : 數據結構的書裡面都有的,仔細看一下 : studyall123的只能對0到9的數字運算才有效,對於10以上的數字就不行!不知道有沒有更好的方法! : 現在的人,連google一下都懶啊 : 實際上是按照逆波蘭式的順序讓輸入的表達式入棧,再根據運算符優先順序來計算。 : lenrning!
Python該怎麼入門?
作為初學者,第一個月的月目標應該是這樣的:
熟悉基本概念(變數,條件,列表,循環,函數)
練習超過 30 個編程問題
利用這些概念完成兩個項目
熟悉至少 2 個框架
開始使用集成開發環境(IDE),Github,hosting,services 等
整體計劃
現在,我們先將月計劃細化成周計劃。
第一周:熟悉 Python
要積極探索 Python 的使用方法,儘可能多的完成下面這些任務:
第一天:基本概念(4 小時):print,變數,輸入,條件語句
第二天:基本概念(5 小時):列表,for 循環,while 循環,函數,導入模塊
第三天:簡單編程問題(5 小時):交換兩個變數值,將攝氏度轉換為華氏溫度,求數字中各位數之和,判斷某數是否為素數,生成隨機數,刪除列表中的重複項等等
第四天:中級編程問題(6 小時):反轉一個字元串(迴文檢測),計算最大公約數,合併兩個有序數組,猜數字遊戲,計算年齡等等
第五天:數據結構(6 小時):棧,隊列,字典,元組,樹,鏈表。
第六天:面向對象編程(OOP)(6 小時):對象,類,方法和構造函數,面向對象編程之繼承
第七天:演算法(6 小時):搜索(線性和二分查找)、排序(冒泡排序、選擇排序)、遞歸函數(階乘、斐波那契數列)、時間複雜度(線性、二次和常量)
通過第一周時間,python大致能熟悉了,自學能力稍微弱一點找人帶下你,節約自己的時間。
注意:別急著安裝 Python 環境!
這看起來很矛盾,但是你一定要相信我。我有幾個朋友,他們因為語言工具包和 IDE 安裝的失敗而逐漸失去了學習下去的慾望。因此,我的建議是先使用一些安卓 app 來探索這門語言,如果你是個技術小白,安裝 Python 環境可不是你的首要任務。
第二周:開始軟體開發(構建項目)
接下來,讓我們朝著軟體開發任務進軍吧!不妨嘗試綜合你學到的知識完成一個實際的項目:
第一天:熟悉一種 IDE(5 小時): IDE 是你在編寫大型項目時的操作環境,所以你需要精通一個 IDE。在軟體開發的初期,我建議你在 VS code 中安裝 Python 擴展或使用 Jupyter notebook。
第二天:Github(6 小時):探索 Github,並創建一個代碼倉庫。嘗試提交(Commit)、查看變更(Diff)和上推(Push)你的代碼。另外,還要學習如何利用分支工作,如何合併(merge)不同分支以及如何在一個項目中創建拉取請求(pull request)。
第三天:第一個項目——簡單計算器(4 小時):熟悉 Tkinter,創建一個簡單的計算器
第四、五、六天:個人項目(每天 5 小時):選定一個項目並完成它。如果你不知道你該做什麼,可以查看下面的清單( pythonprojects -for-an- middle – programmer/answer/jhankar – mahbub2)
第七天:託管項目(5 小時):學習使用伺服器和 hosting 服務來託管你的項目。創建一個 Heroku 設置並部署你構建的應用程序。
為什麼要寫項目?
如果僅僅按部就班地學習課堂上或視頻中的內容,你無法擁有獨立思考能力。所以,你必須把你的知識應用到一個項目中。當你努力尋找答案時,你也在慢慢地學會這些知識。
第三周:讓自己成為一名程序員
第 3 周的目標是熟悉軟體開發的整體過程。你不需要掌握所有的知識,但是你應該知道一些常識,因為它們會影響你的日常工作。
第一天:資料庫基礎(6 小時):基本 SQL 查詢(創建表、選擇、Where 查詢、更新)、SQL 函數(Avg、Max、Count)、關係資料庫(規範化)、內連接、外連接等
第二天:使用 Python 資料庫(5 小時):利用一種資料庫框架(SQLite 或 panda),連接到一個資料庫,在多個表中創建並插入數據,再從表中讀取數據。
第三天:API(5 小時):如何調用 API。學習 JSON、微服務(micro-service)以及表現層應用程序轉換應用程序介面(Rest API)。
第四天:Numpy(4 小時):熟悉 Numpy(- Numpy -for- datascies-beginners-b8088722309f)並練習前 30 個 Numpy 習題(- 100/blob/master/100_numpy_excercises.md)
第五、六天:作品集網站(一天 5 小時):學習 Django,使用 Django 構建一個作品集網站(- start-with-django -1/),也要了解一下 Flask 框架。
第七天:單元測試、日誌、調試(5 小時):學習單元測試(PyTest),如何設置和查看日誌,以及使用斷點調試。
真心話時間(絕密)
如果你非常「瘋狂」,並且非常專註,你可以在一個月內完成這些任務。你必須做到:
把學習 Python 作為你的全職活動。你需要從早上 8 點開始學習,一直到下午 5 點。在此期間,你可以有一個午休時間和茶歇時間(共 1 小時)。
8 點列出你今天要學的東西,然後花一個小時複習和練習你昨天學過的東西。
從 9 點到 12 點:開始學習,並進行少量練習。在午飯後,你需要加大練習量,如果你卡在某個問題上,可以在網上搜索解決方案。
嚴格保持每天 4-5 小時的學習時間和 2-3 小時的練習時間(每周最多可以休息一天)。
你的朋友可能會認為你瘋了。走自己的路,讓別人去說吧!
如果你有一份全職工作,或者你是一名學生,完成這些流程可能需要更長的時間。作為一名全日制學生,我花了 8 個月的時間來完成這份清單。現在我是一名高級開發人員。所以,不管花多長時間,一定要完成它們。要想成功完成一個目標,必須付出百分之百的努力。
第四周:認真考慮工作(實習)問題
第 4 周的目標是認真思考如何才能被錄用。即使你現在不想找工作,你也可以在探索這條道路的過程中學到很多東西。
第一天:準備簡歷(5 小時):製作一份一頁的簡歷。把你的技能總結放在最上面,必須在寫項目的同時附上 Github 鏈接。
第二天:作品集網站(6 小時):寫幾個博客,將它們添加到你之前開發的作品集網站中。
第三天:LinkedIn 簡介(4 小時):創建一個 LinkedIn 個人簡介,把簡歷上的所有內容都放到 LinkedIn 上。
第四天:面試準備(7 小時):準備一些谷歌常見的面試問題,練習白皮書中的 10 個面試編程問題。在 Glassdoor、Careercup 等網站中查看前人遇到的面試問題。
第五天:社交(~小時):走出房門,開始參加聚會、招聘會,與其他開發人員和招聘人員見面。
第六天:工作申請(~小時):搜索「Python Job」,查看 LinkedIn Job 和本地求職網站。選擇 3 個工作崗位並發送工作申請。為每個工作定製你的簡歷。在每個工作要求中找出 2 到 3 件你不知道的事情,並在接下來的 3-4 天里學會它們。
第七天:在拒絕中學習(~小時):每次你被拒絕的時候,找出兩件為了獲得這份工作你應該知道的事情,然後花 4-5 天 的時間來掌握它們。這樣,每次拒絕都會讓你成為更好的開發人員。
分析以下python程序中endings=[‘st’,’nd’,’rd’]+17*[‘th’]+[‘st’,’nd’,’rd’]+7*[‘th’]+[‘st’]有啥作用?
17*[th]
生成
一個長度為17的列表,元素均為’th’。+,將列表合併成一個大的列表。所以這行代碼的作用時生成一個長度為31的後綴字元數組。這樣就可以在day數字(1-31)後面
相應地加上後綴。如(1st,
2nd,
3rd,
4th,
5th,
…
,
19th,
20th,
21st,
22nd,
22rd,
23rd,
24th,
…
,
30th,
31st)。
endings=[‘st’,’nd’,’rd’]+17*[‘th’]+[‘st’,’nd’,’rd’]+7*[‘th’]+[‘st’]
print endings
[‘st’, ‘nd’, ‘rd’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘st’, ‘nd’, ‘rd’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘th’, ‘st’]
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/232322.html