Python 簡介

出自KMU Wiki

跳轉到: 導航, 搜索

本條目所指的 Python 是 Python 程式語言

目錄

[編輯] 概覽

Python 官方網站對 Python 的介紹

A Byte of Python 對 Python 的簡介(中譯版)

Marr 對 Python 的簡介

根據 2008 年 11 月 TIOBE Programming Community Index,Python 的普及率在全世界排名第 6

2008 年 12 月 3 日 發行 Python 3.0 版 (Python 3.0 有何新改變)

[編輯] Python語法

[編輯] Debug (程式除錯) Python

在 Python 原始程式中 import pdb

pdb 的用法和 gdb 很相似

詳情參考 Debugging in Python

[編輯] Python 與中文

[編輯] 免費電子書

Python 官方文件

A Byte of Python

A Byte of Python 中譯版

[編輯] 下載

官方網站下載

校內下載 (2.6,3.0)

[編輯] 參考資料

Python 官方網站

Swaroop C.H.'s Python Notes

[編輯] 練習

[編輯] 檢查一個數是否為質數

  • 題目

由使用者輸入一個整數,然後判斷其是否為質數。

[編輯] 參考解答jai166

import math
#!/usr/local/bin/python
# -*- coding: cp950 -*-
import string
def isInt( strInput ): # 判斷參數是否為整數(全為數字)
        for i in strInput:
                if i<'0' or i>'9' :
                        if i!='-': # 讓負數也可輸入
                                return 0 
        return 1

def isPrime(chkN):
        if isInt(chkN) : chkN=string.atol(chkN)
        else: raise ValueError("%s 並不是整數!" %(chkN) )

        if chkN == -1: return 1 # -1 是質數(1, -1)
        if chkN <-1 : return 0  # -2 以下皆不是質數(1, -1, self, ...)
        if chkN == 0 : return 0 # 任意數*0 = 0
        if chkN == 1 : return 0 # 1 不是質數
        if chkN == 2 : return 1 # 2 唯一的偶數質數
        if ( chkN % 2 )==0 : return 0 # 其他偶數皆不是質數

        sun=3 # 從3 開始的質數測,不測偶數
        end=math.floor(math.sqrt(chkN))+1 # 測到自己開根號
        while sun < end:
                if ( chkN % sun )==0: # 整除
                        return 0
                sun+=2
        return 1

# 程式進入點
while(1):
        try:
                print "請輸入一個數以檢查它是否為質數, 要離開請打 exit",
                input = raw_input()
                if input == "" or input == "exit" : exit()
                if isPrime(input) : print input, "是個質數"
                else: print input, "不是!!"
        except ValueError, err:
                print err
                print "輸入錯誤,請重打一遍"

[編輯] 參考解答mcdlee

#!/usr/bin/env python

import math
import time

x = int(raw_input("enter a number\n"))
start = time.clock()

a = 2
prime = [2]
def say_yes():
	print a, 'is a prime number'

while a <= x:
	if a in prime:
		say_yes()
	for item in prime:
		b = a % item
		if b == 0:
			break
	else:
		say_yes()
		prime.append(a)
	a = a + 1
amount = len(prime)

print 'There is', amount, 'prime number below', x

[編輯] 參考解答sevenstar

[編輯] 參考解答cch


#!/usr/local/bin/python

# This program tests wether an integer is a prime

import sys
import math
import string

print 'This program tests wether an integer is a prime'
while 1 :
        sys.stdout.write('Please input an integer: ')
        s = raw_input()
        n = string.atol(s)
        ub = math.sqrt(n) + 1
        is_prime = 1
        f = 2
        while f < ub :
                if n % f == 0:
                        is_prime = 0
                        print n, ' has a factor ', f
                        break
                else :
                        f = f + 1
        if is_prime == 1 :
                print n, ' is a prime'
        else :
                print n, ' is not a prime'

附註:

  1. FreeBSD 上有一支程式 primes (/usr/games/primes) 可幫我們列出質數以供測試,如: primes 100 200 可列出 100 到 200 間的質數
  2. 根據 維基百科英文版對質數的介紹,有一個 polynomial time 的演算法 AKS

[編輯] 產生個人化訊息

  • 題目

假設今天有一個名單(固定)如下:

99001001 趙一忠
99001024 錢二孝
99002015 孫三仁
99051273 李四愛
99181730 周五信

我們需要通知其中若干位同學,只知道他們的學號,請寫一支程式產生如下訊息:

親愛的 {姓名} 同學,
您學校的 e-mail 信箱是 u{學號}@kmu.edu.tw

[編輯] 參考解答cch

#!/usr/local/bin/python

import string

st = {}
f = file('st.txt')
while True:
        line = f.readline()
        if len(line) == 0:
                break
        line.rstrip()
        e = string.split(line, ' ')
        st[e[0]] = e[1]
f.close()

# for sno, name in st.items() :
#       print "sno = %s name = %s" % (sno, name)

print 'Please input a sno ',
s = raw_input();

print 'Dear %s,\n Your e-mail is u%s@kmu.edu.tw' % (st[s], s)

[編輯] 參考解答mcdlee

#!/usr/bin/env python

import string

#filename = raw_input("Please enter the file name.")
f = file('st.txt')

stlist = {} #create a new dictionary

while True:
	line = f.readline()
	if len(line) == 0:
		break
	line.strip()
	e = string.split(line, ' ')
	if len(e) == 2:
		stlist[e[0]] = e[1]
print stlist.keys()
f.close()

stid = raw_input("Please enter the ID number")
if stlist.has_key(stid):
	stname = stlist[stid]
	print "Dear", stname ,"\n Your e-mail is u",stid,"@kmu.edu.tw"

[編輯] 參考解答jai166

#!/usr/local/bin/python
# -*- coding: cp950 -*-
import string
def isInt( strInput ): # 判斷參數是否為整數(全為數字)
        for i in strInput:
                if i<'0' or i>'9':
                        return 0
        return 1

class customList:
# 程式的主要核心
# 內有 dic 用以儲存輸入的資料 學號:姓名
# 有 Read/Express 處理輸入/輸出的部分,用 Source 選擇資料來源/輸出裝置
        def __init__(self): # 初始化
                self.dic = dict() # 宣告 customList 有個物件 dic 是個 dictionary
                self.ioMethod=iomethod() #ioMethod 是個 iomethod 類別的物件
        def Read(self):
                self.Source()
                self.ioMethod.Read(self.dic)
        def Express(self):
                self.Source()
                self.ioMethod.Express(self.dic)
        def Source(self):
                print "請問要從哪輸入/輸出? 1.螢幕 2.檔案[1]",
                ch = raw_input()
                if ch =="2" :
                        self.ioMethod=iomethodFile()
                else :
                        self.ioMethod=iomethodScreen()
# iomethod 是 iomethodScreen 和 iomethodFile 的原型
class iomethod:
        def express(self,k,v):
                print ("親愛的 %s 同學,\n您學校的 e-mail 信箱是 u%s@kmu.edu.tw" % (v , k) )
        def read(self,inData,dic):
                if inData == "exit" : return 1
                if inData == "" : return 1
                inData = inData.split(" ",2)
                if len(inData)==2 :
                        if inData[0] in dic:
                                print "已有資料,是否覆寫?(Y/n)",
                                ch=raw_input()
                                if ch == "N" or ch == "n":
                                        return 0
                        if isInt(inData[0]):
                                dic[inData[0]]=inData[1]
                        else :
                                print inData[0],inData[1],": ",inData[0],"學號錯誤!!"
                else :
                        for x in inData:
                                print x,
                        print ": 輸入錯誤,請重新輸入"
                return 0
        def ExpressS(self,dic):
                print "1. 依學號輸出結果"
                print "2. 輸出全部結果"
                print "3. 離開"
                print "請選擇您要的選項:",
                ch=raw_input();
                if ch =='1' :
                        self.ExpressOne(dic)
                if ch =='2' :
                        self.ExpressAll(dic)
                if ch =='3' :
                        return
        def ExpressOne(self,dic):
                while(1):
                        print "輸入欲查詢之學號,或輸入exit離開:",
                        ch = raw_input()
                        if ch == "exit" : break
                        if ch == "" : break
                        if ch in dic:
                                self.express(ch, dic[ch])
        def ExpressAll(self,dic):
                for (k, v)in dic.iteritems():
                        self.express(k, v)

class iomethodScreen(iomethod):
        def Read(self,dic):
                while(1):
                        print "輸入名單:學號 姓名,或打exit離開:",
                        inData=raw_input();
                        if self.read(inData,dic):
                                break
        def Express(self,dic):
                self.ExpressS(dic)

class iomethodFile(iomethod):
        def Read(self,dic):
                try:
                        self.s=self.Source("r")
                        while (1):
                                inData = self.s.readline()
                                if inData == "": return
                                inData=inData.partition('\n')[0]
                                self.read(inData,dic)
                        s.close()
                except IOError:
                        print "檔案來源錯誤: "
                        return
        def Express(self,dic):
                self.s=self.Source("w")
                self.ExpressS(dic)
                self.s.close()
        def express(self,k,v):
                self.s.write("親愛的 %s 同學,\n您學校的 e-mail 信箱是 u%s@kmu.edu.tw\n" % (v , k) )
        def Source(self,mode):
                if mode == "r":
                        print "來源檔案是?[data.txt]",
                else :
                        if mode == "w":
                                print "輸出檔案是?[out.txt]",
                        else :
                                pass
                name = raw_input()
                if name == "":
                        if mode == "r":
                                name = "data.txt"
                        else :
                                if mode == "w":
                                        name = "out.txt"
                f=open(name, mode)
                return f
# 程式進入點
data = customList()
while(1):
        print "1. 讀取資料"
        print "2. 輸出結果"
        print "3. 結束"
        print "請選擇您要的選項:",
        ch=raw_input()
        if ch =='1' :
                data.Read()
        if ch =='2' :
                data.Express()
        if ch =='3' :
                exit()

[編輯] 隨機抽樣名單

假設有以下的學號 (五個系所,連號):

99000001 ~ 99000100

99001001 ~ 99001050

99002001 ~ 99002064

99025001 ~ 99025072

99026001 ~ 99026036

其中開頭兩碼為入學年,接下來三碼為系所代碼,末三碼為序號, 請產生一個每班抽樣 10% 的隨機名單。

[編輯] 參考解答jai166

#!/usr/local/bin/python
# -*- coding: cp950 -*-
import string
import random
import math
import pdb
global lengthClass, lengthStd
lengthClass = 5
lengthStd = 3
def randSelect(alln, howmuch): # all: list
	results = set()
	random.seed()
	howmuch=int(howmuch)
	if howmuch == 0 : return results
	while 1:
		temp=int(random.random()*len(alln)) # random() return 0~1
		if int(alln[temp]) in results:
			continue
		else:
			results.add(int(alln[temp]))
			if len(results) == howmuch:
				return results

def dataInput(database):
	print "Please enter student's number, or type 'exit'"
	while 1:
		ch = raw_input()
		if ch == "exit" : return
		if ch == "" : return
		ch=string.atoi(ch)
		classNo = int(ch/(math.pow(10,lengthStd)))
		if classNo not in database:
			database[classNo]=list()
		database[classNo].append(ch)

def dataInput2(database):
	print "Please enter the leading ", lengthClass, " characters of student's number, or type 'exit'",
	classNo = raw_input()
	if ch == "exit" : return
	if ch == "" : return
	print "How many people in this class??",
	ch2 = raw_input()
	classNo = int(classNo)
	ch2 = int(ch2)
	if classNo not in database:
		database[classNo]=list()
	for i in range(0,ch2):
		if classNo*math.pow(10,lengthStd)+i+1 not in database[classNo]:
			database[classNo].append(classNo*math.pow(10,lengthStd)+i+1)

def dataOutput(database):
	for x in database:
		i=0
		for y in randSelect(database[x],len(database[x])/10):
			print y,
			i=(i+1)%5
			if i!=0: print "",
			else : print ""
	print "\n"

database = dict()
while 1:
	print "1. input by number"
	print "2. input by class"
	print "3. output"
	print "4. exit"

	ch = raw_input()
	if ch == "1" : dataInput(database)
	if ch == "2" : dataInput2(database)
	if ch == "3" : dataOutput(database)
	if ch == "4" : exit()