閱讀304 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[Python學習] 專題一.函數的基礎知識

        最近才開始學習Python語言,但就發現了它很多優勢(如語言簡潔、網絡爬蟲方麵深有體會).我主要是通過《Python基礎教程》和"51CTO學院 智普教育的python視頻"學習,在看視頻中老師講述函數知識的時候覺得非常不錯,所以就寫了第一篇Python學習的文章分享給大家.主要內容:
        1.Python安裝與基本輸入輸出,print()函數和raw_input()函數簡單用法.
        2.我根據視頻中學到的知識,講解函數的基本知識:
            (1).係統提供內部函數:字符串函數庫、數學函數庫、網絡編程函數庫、OS函數庫
            (2).第三方提供函數庫:講解如何安裝httplib2第三方函數庫,再做了個簡單的網頁爬蟲例子
            (3).用戶自定義函數:講解無返回類型、有形參、預設值參數等自定義函數
        3.同時網絡編程中與C#以前學過的進行了簡單對比,發現python確實有很多優點,而且很方便強大.

        PS:文章中引用了很多視頻中的知識、書籍知識和自己的知識,感謝那些作者和老師,希望文章對大家有所幫助,才開始學習python知識,如果文章中有錯誤或不足之處,還請海涵,也希望大家提出意見與君共勉.勿噴~

一. Python安裝及輸入輸出函數

        python解釋器在Linux中可以內置使用安裝,windows中需要去www.python.org官網downloads頁麵下載(如python-2.7.8.amd64.msi),安裝Python集成開發環境(Python Integrated Development Environment,IDLE)即可.運行程序輸入">>>print 'hello world'"則python解釋器會打印輸出"hello world"字符串. 如下:

 
        然後講述Python程序的基本框架是"輸入-處理-輸出",而輸入輸出函數如下:
        1.print()函數
        函數用於輸出或打印整型、浮點型、字符串數據至屏幕,如print(3)、print(12.5)、print('H').它輸出變量格式"print(x)或print x",而且可以輸出多個變量"print x,y,z".並且支持格式化輸出數據,調用format()函數,其格式為:
        print(format(val,format_modifier)) 其中val表示值,format_modifier表示格式字.

#簡單輸出
>>> print(12.5)
12.5
>>> print("eastmount")
eastmount
#輸出"123.46",6.2表示輸出6位,小數點後精度2位,輸出最後一位6是四舍五入的結果
>>> print(format(123.45678,'6.2f'))
123.46
#輸出"口口口123",采用右對齊補空格方式輸出總共6位
>>> print(format(123.45678,'6.0f'))
   123
#輸出"123.456780000"小數點後麵9位,超出範圍會自動補0
>>> print(format(123.45678,'6.9f'))
123.456780000
#輸出"34.56%"表示打印百分率
>>> print(format(0.3456,'.2%'))
34.56%

        2.raw_input()函數
        內建函數從sys.stdin接受輸入,讀取輸入語句並返回string字符串.輸入以換行符結束,通過help(raw_input)可以查找幫助,常見格式為:
        s = raw_input([prompt]) 參數[prompt]可選,用於提示用戶輸入.

#輸入函數
>>> str1 = raw_input("please input a string:")
please input a string:I love you
>>> print(str1)
I love you
#查看str1數據類型
>>> type(str1)
<type 'str'>

        注意raw_input()與input()的區別:(1).input支持合法python表格式"abc",字符串必須用引號括起,否則會報錯"NameError: name 'abc' is not defined",而raw_input()任何類型輸入都可接受; (2).raw_input()將所有輸入作為字符串,返回string,而input()輸入純數字時具有自己的特性,返回輸入的數字類型int或float.舉例解釋如下:

#SyntaxError語法錯誤
>>> str1 = input("input:")
input:abc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'abc' is not defined
#正確輸入輸出
>>> str1 = input("input:")
input:"I love you"
>>> print str1
I love you
#input純數字 數據類型
>>> weight = input("weight:")
weight:12.5
>>> type(weight)
<type 'float'>
#raw_input 數據類型均為str
>>> age = raw_input("age:")
age:20
>>> type(age)
<type 'str'>

二. 函數之係統提供內部函數

        python提供的係統內部庫函數主要講述一下四種類型:(引自視頻,隻簡單介紹)
       
1.字符串函數庫
        通過help(str)可以查詢字符串函數庫,其中查詢過程中"-More-"輸入回車實現滾動信息,輸出"q"退出幫助(Quit).字符串函數大家都比較熟悉,無論C\C++\C#\Java都學過很多,而且基本大同小異.如:
        islower()函數判斷字符串是否大小寫,一個大寫返回False.前麵使用的format()函數、求字符串長度len()函數均屬於字符串函數庫,help(str.replace)可以查詢具體函數用法,該函數用於新字符串替換舊字符串.

#判斷字符串是否小寫
>>> str1 = "Eastmount"
>>> str1.islower()
False
#字符串替換
>>> str2 = 'adfababdfab'
>>> str2.replace('ab','AB')
'adfABABdfAB'
#字符串求長度
>>> print(len(str2))
11
>>>

        2.數學函數庫
        使用數學函數庫時需要注意的是導入庫"import math",該庫中函數我們也非常熟悉,如sin()求正弦,cos()求餘弦,pow(x,y)計算x的y次冪,如pow(3,4)=3*3*3*3,python中也可以使用3**4表示.help(math)中可以查看詳細信息,而且庫中定義了兩個常數DATA:
       
e = 2.718281... pi = 3.14159265...

#導入math庫
>>> import math
>>> print math.pi
3.14159265359
#計算sin30度
>>> val = math.sin(math.pi/6)
>>> print val
0.5
#pow函數
>>> math.pow(3,4)
81.0
>>> 3**4
81
>>> help(math.pow)
Help on built-in function pow in module math:

pow(...)
    pow(x, y)

    Return x**y (x to the power of y).
>>>

        3.網絡編程庫
        係統提供內部庫函數中網絡編程庫,我此處僅僅舉個簡單例子,socket(套接字網絡編程)獲取主機ip地址這是非常常見的運用,我將與C#網絡編程進行簡單對比.後麵的博文中將詳細講述python網絡編程.

>>> import socket
>>> baiduip = socket.gethostbyname('www.baidu.com')
>>> print baiduip
61.135.169.125

        其中socket編程很常用,gethostbyname()返回指定主機ip,而C#中獲取百度網址的ip地址代碼如下所示.代碼中可能會出現"警告:Dns.GetHostByName()函數已過時",可替換為IPHostEntry myHost = Dns.GetHostEntry(www.baidu.com).輸出:
        61.135.169.121
        61.134.169.125

//引用新命名空間
using System.Net;

namespace GetIp
{
    class Program
    {
        static void Main(string[] args)
        {
            //獲取DNS主機名的DNS信息
            IPHostEntry myHost = Dns.GetHostByName("www.baidu.com");
            IPAddress[] address = myHost.AddressList;
            for (int index = 0; index < address.Length; index++)
            {
                Console.WriteLine(address[index]);
            }
            Console.ReadKey();    
        }
    }
}

        4.操作係統(OS)函數庫
        操作係統庫函數引用"import os",舉例獲取當前工作路徑和先死當前路徑下的文件和目錄.使用os.system("cls")可以實現清屏功能.安裝python目錄Lib文件夾下含有很多py庫文件供使用.

>>> import os
#獲取當前工作路徑
>>> current = os.getcwd()
>>> print current
G:\software\Program software\Python\python insert
#獲取當前路徑下的文件和目錄
>>> dir = os.listdir(current)
>>> print dir
['DLLs', 'Doc', 'h2.txt', 'include', 'Lib', 'libs', 'LICENSE.txt
', 'NEWS.txt', 'python.exe', 'pythonw.exe', 'README.txt', 'tcl', 'Tools']
>>>

三. 函數之第三方提供函數庫及安裝httplib2模塊過程

(一).安裝第三方函數庫httplib2過程
        Python中第三方開源項目中提供函數庫供我們使用,比如使用httplib2庫函數.在Linux中直接使用"easy_install httplib2"搜索自動安裝,Windows下python開發工具IDLE裏安裝httplib2模塊的過程如下(其他模塊類似).
        1.下載httplib2模塊"
https://code.google.com/p/httplib2/"到指定目錄,解壓壓縮包"httplib2_0.8.zip"到某目錄下,如果該網址google訪問失敗,可以到此處下載:
        2.配置python運行環境
        右鍵"計算機"->"屬性"->在"係統"中選擇"高級係統設置"->在"係統屬性"中"高級"選擇"環境變量"

        在係統環境變量Path後添加python安裝目錄"G:\software\Program software\Python\python insert"

        3.在dos下安裝httpLib2
        管理員模式運行cmd,利用cd命令進入httplib2_0.8.zip解壓目錄,輸入"python settup.py install",如下圖所示安裝成功.

        4.使用httplib2
        如果httplib2庫函數沒有安裝成功,"import httplib2"會提示錯誤"ImportError: No module named httplib2".否則安裝成功,舉例如下.看參考更多"Python - 熟悉httplib2"

import httplib2
#獲取HTTP對象
h = httplib2.Http()
#發出同步請求並獲取內容
resp, content = h.request("https://www.csdn.net/")
#顯示返回頭信息
print resp
#顯示網頁相關內容
print content

輸出頭信息:
{'status': '200', 'content-length': '108963', 'content-location': 'https://www.csdn.net/', .... 'Fri, 05 Sep 2014 20:07:24 GMT', 'content-type': 'text/html; charset=utf-8'}

(二).簡單網頁爬蟲示例
        使用第三方函數庫時的具體格式為module_name.method(parametes) 第三方函數名.方法(參數).        
        講述一個引用web庫,urllib庫訪問公網上網頁,webbrowser庫調用瀏覽器操作,下載csdn官網內容並通過瀏覽器顯示的實例.

import urllib
import webbrowser as web
url = "https://www.soso.com"
content = urllib.urlopen(url).read()
open("soso.html","w").write(content)
web.open_new_tab("soso.html")

        它會輸出True並在瀏覽器中打開下載的靜態網頁.引用import webbrowser as web使用web,也可以直接引用,使用時"module_name.method"即可.讀者可以對比我的C#文章"C# 網絡編程之網頁簡單下載實現".
        content = urllib.urlopen(url).read()表示打開url並讀取賦值
       
open("soso.html","w").write(content)表示在python安裝目錄寫靜態soso.html文件
        web.open_new_tab("soso.html")表示打開該靜態文件新標簽.

        同樣可以使用web.open_new_tab('https://www.soso.com')直接在瀏覽器打開動態網頁.效果如下圖所示:

 

四. 函數之自定義函數

        1.無返回值自定義函數
        其基本語法格式如下:
                                          def function_name([parameters]):    函數名([參數]),其中參數可有可無
                                          (TAB) statement1
                                          (TAB) statement2
                                                  ...

        注意:(1).自定義函數名後麵的冒號(:)不能省略,否則報錯"invalid syntax",而且無需像C語言一樣加{};
                 (2).函數裏每條語句前都有縮進TAB,否則會報錯"There's an error in your programs:expected an indented block",它的功能相當於區分函數裏的語句與函數外的語句.
        舉例:打開IDLE工具->點擊欄"File"->New File新建文件->命名為test.py文件,在test文件裏添加代碼如下.

def fun1():
    print 'Hello world'
    print 'by eastmount csdn'

print 'output'
fun1()

def fun2(val1,val2):
    print val1
    print val2

fun2(8,15)

        保存,在test.py文件裏點擊Run->Run Module.輸出結果如下圖所示,其中fun1()函數無形參自定義函數,fun2(val1,val2)是有形參自定義函數,fun2(8,15)為函數的調用,實參8和15.

        2.有返回值自定義函數
        其基本語法格式如下:
                                        
def funtion_name([para1,para2...paraN])
                                               statement1
                                               statement2
                                                    ....
                                               return value1,value2...valueN
        返回值支持一個或多個返回,需要注意的是自定義函數有返回值,主調函數就需要接受值(接受返回的結果).同時在定義變量時可能sum這些可能是關鍵字(注意顏色),最好使用不是關鍵字的變量.舉例:

def fun3(n1,n2):
    print n1,n2
    n = n1 + n2
    m = n1 - n2
    p = n1 * n2
    q = n1 / n2
    e = n1 ** n2
    return n,m,p,q,e

a,b,c,d,e = fun3(2,10)
print 'the result are ',a,b,c,d,e

re = fun3(2,10)
print re

        輸出結果如下,其中需要注意的是參數一一對應,在除法中2/10=0,**冪運算2的10次方=1024.而使用re=fun3(2,10)直接輸出的結果成為元組,後麵會詳細講述,(12,-8,20,0,1024)元組中re[0]存儲12,re[1]存儲-8,依次~

2 10
the result are  12 -8 20 0 1024
2 10
(12, -8, 20, 0, 1024)

        3.自定義函數參數含預定義
        預設值的基本格式如下:
                                             def function_name(para1,para2...parai=default1...paran=defaultn)
                                                    statement1
                                                    statement2
                                                          ...
                                                    return value1,value2...valuen
        其中需要注意的是預定義值得參數不能先於無預定義值參數,舉個例子講解.

def fun4(n1,n2,n3=10):
    print n1,n2,n3
    n = n1 + n2 + n3
    return n

re1 = fun4(2,3)
print 'result1 = ',re1
re2 = fun4(2,3,5)
print 'result2 = ',re2

        輸出結果如下圖所示,預定義的參數在調用時,實參可以省略,也可以替換默認定義的預定義值.

2 3 10
result1 =  15
2 3 5
result2 =  10

        其中如果函數定義為def fun4(n3=10,n2,n1)就會報錯"non-default argument follows default argument"(沒預定義的參數在預定義參數的後麵),所以定義函數時需要注意該點.
        同時需要注意函數調用時的賦值順序問題,最好采用一對一複製,也可以函數調用中給出具體形參進行賦值,但需要注意的是在函數調用過程中(使用函數時),有預定義值的參數不能先於無預定義值參數被賦值.
        如例子中自定義函數def fun4(n1,n2,n3=10),在調用時可以:
        (1).s=fun4(2,3)省略預定義參數,它是一對一賦值,其中n1賦值2、n2賦值3、n3賦值10(預定義)
        (2).s=fun4(4,n2=1,n3=12)它也是一對一賦值,而且預定義值n3替換為12
        (3).s=fun4(n2=1,n1=4,n3=15)它的順序與定義函數沒有對應,但是調用時給出具體對應也行
        下麵的情況就會出現所述的"有預定義值的參數先於無預定義值參數被賦值"錯誤:
        (1).s=fun4(n3=12,n2=1,4)此時會報錯"non-keyword arg after keyword arg",它不能指定n1=4,就是沒有指定預定值n1=4在有預定值n3=12,n2=1之後,如果改成s=fun4(4,n2=1,n3=12)或s=fun4(4,n3=12,n2=1)即可.
        (2).s=fun4(4,n1=2)此時也會報錯"TypeError: fun4() got multiple values for keyword argument 'n1'",它不能指定n1=2&n2=4,而是n1會賦值多個.
        所以,最好還是一一對應的調用函數,平時寫程序沒有這樣去刁難自己,對應即可

        總結:文章從係統提供的內部函數、第三方提供函數庫+簡單爬出代碼及安裝httplib2模塊過程和用戶自定函數三個方麵進行講述.文章中如果有錯誤或不足之處,海涵~最後感謝那個視頻老師和上述博主、書籍老師及me.
        Python 公開課視頻鏈接
https://edu.51cto.com/course/course_id-527.html
        最後祝大家中秋節快樂!全家團圓,聚聚玩玩.
        (By:Eastmount 2014-9-8 夜5點 原創CSDN https://blog.csdn.net/eastmount/
)

最後更新:2017-04-03 05:40:17

  上一篇:go 軟件工程學習之初
  下一篇:go [麵試題]構造函數