在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 函數(shù)練習
標準庫 (4)
如何成為 Python 高手
標準庫 (6)
標準庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準備
函數(shù)練習
標準庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標準庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實戰(zhàn)
運算符
類(3)
字典(2)
語句(1)
數(shù)和四則運算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標準庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學函數(shù)和運算優(yōu)先級
字符串(3)
為計算做準備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標準庫 (2)
列表(2)
元組

函數(shù)練習

已經(jīng)學習了函數(shù)的基本知識,現(xiàn)在練習練習。完成下面練習的原則:

  1. 請讀者先根據(jù)自己的設(shè)想寫下代碼,然后運行調(diào)試,檢查得到的結(jié)果是否正確
  2. 我也給出參考代碼,但是,參考代碼并不是最終結(jié)果
  3. 讀者可以在上述基礎(chǔ)上對代碼進行完善
  4. 如果讀者愿意,可以將代碼提交到 github 上,或者到我的 QQ 群(群號:26913719)中跟大家分享討論

解一元二次方程

解一元二次方程,是初中數(shù)學中的基本知識,一般來講解法有:公式法、因式分解法等。讀者可以根據(jù)自己的理解,寫一段求解一元二次方程的程序。

最簡單的思路就是用公式法求解,這是普適法則(普世法則?普適是否等同于普世?)。

古巴比倫留下的陶片顯示,在大約公元前 2000 年(2000 BC)古巴比倫的數(shù)學家就能解一元二次方程了。在大約公元前 480 年,中國人已經(jīng)使用配方法求得了二次方程的正根,但是并沒有提出通用的求解方法。公元前 300 年左右,歐幾里得提出了一種更抽象的幾何方法求解二次方程。

7 世紀印度的婆羅摩笈多(Brahmagupta)是第一位懂得用使用代數(shù)方程,它同時容許有正負數(shù)的根。

11 世紀阿拉伯的花拉子密 獨立地發(fā)展了一套公式以求方程的正數(shù)解。亞伯拉罕·巴希亞(亦以拉丁文名字薩瓦索達著稱)在他的著作 Liber embadorum 中,首次將完整的一元二次方程解法傳入歐洲。(源自《維基百科》)

參考代碼:

#!/usr/bin/env Python
# coding=utf-8

"""
solving a quadratic equation
"""

from __future__ import division
import math

def quadratic_equation(a,b,c):
    delta = b*b - 4*a*c
    if delta<0:
        return False
    elif delta==0:
        return -(b/(2*a))
    else:
        sqrt_delta = math.sqrt(delta)
        x1 = (-b + sqrt_delta)/(2*a)
        x2 = (-b - sqrt_delta)/(2*a)
        return x1, x2

if __name__ == "__main__":
    print "a quadratic equation: x^2 + 2x + 1 = 0"
    coefficients = (1, 2, 1)
    roots = quadratic_equation(*coefficients)
    if roots:
        print "the result is:",roots
    else:
        print "this equation has no solution."

保存為 20501.py,并運行之:

$ python 20501.py 
a quadratic equation: x^2 + 2x + 1 = 0
the result is: -1.0

能夠正常運行,求解方程。

但是,如果再認真思考,發(fā)現(xiàn)上述代碼是有很大改進空間的。至少我發(fā)現(xiàn):

  • 如果不小心將第一個系數(shù)(a)的值輸入了 0,程序肯定會報錯。如何避免之?要記住,任何人的輸入都是不可靠的。
  • 結(jié)果貌似只能是小數(shù),這在某些情況下是近似值,能不能得到以分數(shù)形式表示的精確結(jié)果呢?
  • 復數(shù),Python 是可以表示復數(shù)的,如果 delta<0,是不是寫成復數(shù)更好,畢竟我是學過高中數(shù)學的。

讀者是否還有其它改進呢?你能不能進行改進,然后跟我和其他朋友一起來分享你的成就呢?

至少要完成上述改進,可能需要其它的有關(guān) Python 知識,甚至于前面沒有介紹。這都不要緊,掌握了基本知識之后,在編程的過程中,就要不斷發(fā)揮 google 的優(yōu)勢,讓她幫助你找尋完成任務(wù)的工具。

Python 是一個開發(fā)的語言,很多大牛人都寫了一些工具,讓別人使用,減輕了后人的勞動負擔。這就是所謂的第三方模塊。雖然 Python 中已經(jīng)有一些“自帶電池”,即默認安裝的,比如上面程序中用到的 math,但是我們還嫌不夠。于是又很多第三方的模塊來專門解決某個問題。比如這個解方程問題,就可以使用 SymPy(www.sympy.org)來解決,當然 NumPy 也是非常強悍的工具。

統(tǒng)計考試成績

每次考試之后,教師都要統(tǒng)計考試成績,一般包括:平均分,對所有人按成績從高到低排隊,誰成績最好,誰成績最差。還有其它的統(tǒng)計項,暫且不做了。只統(tǒng)計這幾項吧。下面的任務(wù)就是讀者轉(zhuǎn)動腦筋,思考如何用程序?qū)崿F(xiàn)上面的統(tǒng)計。為了簡化,以字典形式表示考試成績記錄,例如:{"zhangsan":90, "lisi":78, "wangermazi":39},當然,也許不止這三項,可能還有,每個老師所處理的內(nèi)容稍有不同,因此字典里的鍵值對也不一樣。

怎么做?

有幾種可能要考慮到:

  • 最高分或者最低分,可能有人并列。
  • 要實現(xiàn)不同長度的字典作為輸入值。
  • 輸出結(jié)果中,除了平均分,其它的都要有姓名和分數(shù)兩項,否則都匿名了,怎么刺激學渣,表揚學霸呢?

不管你是學渣還是學霸,都能學好 Python。請思考后敲代碼調(diào)試你的程序,調(diào)試之后再閱讀下文。

參考代碼:

#!/usr/bin/env Python
# coding=utf-8
"""
統(tǒng)計考試成績
"""
from __future__ import division

def average_score(scores):
    """
    統(tǒng)計平均分.
    """
    score_values = scores.values()
    sum_scores = sum(score_values)
    average = sum_scores/len(score_values)
    return average

def sorted_score(scores):
    """
    對成績從高到低排隊.
    """
    score_lst = [(scores[k],k) for k in scores]
    sort_lst = sorted(score_lst, reverse=True)
    return [(i[1], i[0]) for i in sort_lst]

def max_score(scores):
    """
    成績最高的姓名和分數(shù).
    """
    lst = sorted_score(scores)    #引用分數(shù)排序的函數(shù) sorted_score
    max_score = lst[0][1]
    return [(i[0],i[1]) for i in lst if i[1]==max_score]

def min_score(scores):
    """
    成績最低的姓名和分數(shù).
    """
    lst = sorted_score(scores)
    min_score = lst[len(lst)-1][1]
    return [(i[0],i[1]) for i in lst if i[1]==min_score]

if __name__ == "__main__":
    examine_scores = {"google":98, "facebook":99, "baidu":52, "alibaba":80, "yahoo":49, "IBM":70, "android":76, "apple":99, "amazon":99}

    ave = average_score(examine_scores)
    print "the average score is: ",ave    #平均分

    sor = sorted_score(examine_scores)
    print "list of the scores: ",sor      #成績表

    xueba = max_score(examine_scores)
    print "Xueba is: ",xueba              #學霸們

    xuezha = min_score(examine_scores)
    print "Xuzha is: ",xuezha             #學渣們

保存為 20502.py,然后運行:

$ python 20502.py
the average score is:  80.2222222222
list of the scores:  [('facebook', 99), ('apple', 99), ('amazon', 99), ('google', 98), ('alibaba', 80), ('android', 76), ('IBM', 70), ('baidu', 52), ('yahoo', 49)]
Xueba is:  [('facebook', 99), ('apple', 99), ('amazon', 99)]
Xuzha is:  [('yahoo', 49)]

貌似結(jié)果還不錯。不過,還有改進余地,看看現(xiàn)實,就感覺不怎么友好了??垂倌懿荒軆?yōu)化一下?當然,里面的函數(shù)也不一定是最好的方法,你也可以修改優(yōu)化。期盼能夠在我上面公布的途徑中交流一二。

找素數(shù)

這是一個比較常見的題目。我們姑且將范圍縮小一下,找出 100 以內(nèi)的素數(shù)吧。

還是按照前面的管理,讀者先做,然后我提供參考代碼,然后自行優(yōu)化。

質(zhì)數(shù)(Prime number),又稱素數(shù),指在大於1的自然數(shù)中,除了 1 和此整數(shù)自身外,無法被其他自然數(shù)整除的數(shù)(也可定義為只有 1 和本身兩個因數(shù)的數(shù))。

哥德巴赫猜想是數(shù)論中存在最久的未解問題之一。這個猜想最早出現(xiàn)在 1742 年普魯士人克里斯蒂安·哥德巴赫與瑞士數(shù)學家萊昂哈德·歐拉的通信中。用現(xiàn)代的數(shù)學語言,哥德巴赫猜想可以陳述為:“任一大于 2 的偶數(shù),都可表示成兩個質(zhì)數(shù)之和?!?。哥德巴赫猜想在提出后的很長一段時間內(nèi)毫無進展,直到二十世紀二十年代,數(shù)學家從組合數(shù)學與解析數(shù)論兩方面分別提出了解決的思路,并在其后的半個世紀里取得了一系列突破。目前最好的結(jié)果是陳景潤在 1973 年發(fā)表的陳氏定理(也被稱為“1+2”)。(源自《維基百科》)

對這個練習,我的思路是先做一個函數(shù),用它來判斷某個整數(shù)是否是素數(shù)。然后循環(huán)即可。參考代碼:

#!/usr/bin/env Python
# coding=utf-8

"""
尋找素數(shù)
"""

import math

def is_prime(n):
    """
    判斷一個數(shù)是否是素數(shù)
    """
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n) + 1)):
        if n % i == 0:
            return False
    return True

if __name__ == "__main__":
    primes = [i for i in range(2,100) if is_prime(i)]    #從 2 開始,因為 1 顯然不是質(zhì)數(shù)
    print primes

代碼保存后運行:

$ python 20503.py 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

打印出了 100 以內(nèi)的質(zhì)數(shù)。

還是前面的觀點,這個程序你或許也發(fā)現(xiàn)了需要進一步優(yōu)化的地方,那就太好了。另外,關(guān)于判斷質(zhì)數(shù)的方法,還有好多種,讀者可以自己創(chuàng)造或者網(wǎng)上搜索一些,拓展思路。

編寫函數(shù)的注意事項

編寫函數(shù),在開發(fā)實踐中是非常必要和常見的,一般情況,你寫的函數(shù)應該是:

  1. 盡量不要使用全局變量。
  2. 如果參數(shù)是可變類型數(shù)據(jù),在函數(shù)內(nèi),不要修改它。
  3. 每個函數(shù)的功能和目標要單純,不要試圖一個函數(shù)做很多事情。
  4. 函數(shù)的代碼行數(shù)盡量少。
  5. 函數(shù)的獨立性越強越好,不要跟其它的外部東西產(chǎn)生關(guān)聯(lián)。

總目錄   |   上節(jié):函數(shù)(4)   |   下節(jié):類(1)

如果你認為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。

上一篇:分析 Hello下一篇:標準庫 (6)