python 学习笔记day03-python基础、python对象、数字、函数
python基礎
????語句和語法
????????注釋及續行
????????????首要說明的是:盡管python可讀性最好的語言之一,這并不意味者程序員在代碼中就可以不寫注釋
??? ????????和很多UNIX腳本類似,python注釋語句從#字符開始
????????????注釋可以在一行的任何地方開始,解釋器會忽略掉該行#之后的所有內容
????????????一行過長的語句可以使用反斜杠\分解成幾行
????????縮進及代碼組
????????????縮進相同的一組語句構成一個代碼塊,稱之為代碼組
????????????首行以關鍵字開始,以冒號:結束,該行之后的一行或多行代碼構成代碼組
????????????如果代碼組只有一行,可以將其直接寫在冒號后面,但是這樣的寫法可讀性差,不推薦
????????同行多個語句
????????????分號;允許你將多個語句寫在同一行上
????????????但是這些語句不能在這行開始一個新的代碼塊
??? ????????因為可讀性差,所以不推薦使用
????????????????>>> a = 3;print a
????????????????3
????????????????>>> x = 3;def foo(): print x
????????????????? File "<stdin>", line 1
??????????????????? x = 3;def foo(): print x
??????????????????????????? ^
????????????????SyntaxError: invalid syntax
????變量賦值
????????賦值運算符
????????????python語言中,等號=是主要的賦值運算符
????????????賦值并不是直接將一個值賦給一個變量
????????????在python中,對象是通過引用傳遞的。在賦值時,不管這個對象十新創建的,還是一個已經存在的,都是將該對象的引用(并不是值)賦值給變量
????????????python也支持鏈式多重賦值
????????????????>>> x=y=1
????????????????>>> x
????????????????1
????????????????>>> y
????????????????1
??? ????增量賦值
????????????從python 2.0開始,等號可以和一個算數運算符結合在一起,將計算結果重新賦值給左邊的變量,這被稱為增量賦值
????????????????>>> x=1
????????????????>>> x=x+1
????????????????>>> x
????????????????2
????????????????>>> x += 1
????????????????>>> x
????????????????3
????????????????>>> x++
????????????????? File "<stdin>", line 1
??????????????????? x++
????????????????????? ^
????????????????SyntaxError: invalid syntax
????????????????>>> ++x
????????????????3
??? ????多元賦值
????????????另一種將多個變量同時賦值的方法稱為多元賦值,采用這種方式賦值時,等號兩邊的對象都是元組
????????????????>>> x,y,z=1,2,'a string'
????????????????>>> print 'x=%d,y=%d' %(x,y)
????????????????x=1,y=2
????????????????>>> x,y = y,x
????????????????>>> print 'x=%d,y=%d' %(x,y)
????????????????x=2,y=1
??? 標識符
????????合法的標識符
????????????python 標識符字符串規則和其他大部分用C編寫的高級語言相似
????????????第一個字符必須十字母或下劃線(_)
????????????剩下的字符可以使字母和數字或下劃線
????????????大小寫敏感
????????關鍵字
????????????和其它的高級語言一樣,python也擁有一些被稱作關鍵字的保留字符
????????????任何語言的關鍵字應該保持相對的穩定,但是因為python是一門不斷成長和進化的語言,其關鍵字偶爾會更新
????????????關鍵字列表和iskyward()函數都放入了keyword模塊以便查閱
????????????????>>> import keyword
????????????????>>> keyword.iskeyword("if")? #判斷if是不是關鍵字
????????????????True
????????????????>>> keyword.kwlist
????????????????['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
>>>
??? ????內建
????????????除了關鍵字之外,python還有可以在任何一級代碼使用的“內建”的名字集合,這些名字可以由解釋器設置或使用
????????????雖然built-in不是關鍵字,但是應該把它當作“系統保留字”
????????????保留的常量如:True、False、None
????????????????>>> len = 10
????????????????>>> len('abcdf')
????????????????Traceback (most recent call last):
????????????????? File "<stdin>", line 1, in <module>
????????????????TypeError: 'int' object is not callable
????????????????>>> del len
????????????????>>> len
????????????????<built-in function len>
????????????????>>> len('abcdf')
????????????????5
??? 基本風格
????????模塊結構及布局
????????????編寫程序時,應該建立一個統一且容易閱讀的結構,并將它應用到每一個文件中去
????????????????#!/usr/bin/env python? #起始行
????????????????"this is a test module"? #模塊文檔字符串
????????????????import sys?????????????? #導入模塊
????????????????import os
????????????????debug = True???????????? #全局變量聲明
????????????????class FooClass(object):? #類定義
??????????????? ‘Foo class’
??????????????? pass
????????????????def test():????????????? #函數定義
??????????????????? "test function"
??????????????????? foo = FooClass()
??????????????? if __name__ == '__main__': #程序主體
??????????????? test()
????????主程序中的測試代碼
????????????優秀的程序員和軟件工程師,總是會為其應用程序提供一組測試代碼或者簡單教程
????????????測試代碼僅當該文件被直接執行時運行,即被其他模塊導入時不執行
????????????利用__name__ 變量這個有力條件,將測試代碼放在一個函數中,如果該模塊是被當成腳本運行,就調用這個函數
練習:創建文件
1、編寫一個程序,要求用戶輸入文件名
2、如果文件已經存在,要求用戶重新輸入
3、提示用戶輸入數據,每行數據先寫到列表中
4、將列表數據寫入到用戶輸入的文件中
#!/usr/bin/env python
import os
contents = []
while True:
??? fname = raw_input("Plz input a file name: ")
??? if not os.path.exists(fname):
??????? break
??? print "%s already exists.Try again." % fname
while True:
??? data = raw_input("(Enger to quit)> ")
??? if? not data:
??????? break
??? contents.append(data + '\n')
fobj = open(fname,'w')
fobj.writelines(contents)
fobj.close()
升級版:(改成函數模式)
#!/usr/bin/env python
import os
def get_fname():
??? while True:
??????? fname = raw_input("Plz input a file name: ")
??????? if not os.path.exists(fname):
??????????? break
??????? print "%s already exists.Try again." % fname
??? return fname
def get_contents():
??? contents = []
??? while True:
??????? data = raw_input("(Enger to quit)> ")
??????? if? not data:
??????????? break
??????? contents.append(data + '\n')
??? return contents
def wfile():
??? fobj = open(fname,'w')
??? fobj.writelines(contents)
??? fobj.close()
if __name__ == '__main__':
??? filename = get_fname()
??? lines = get_contents()
??? wfile(filename,lines)
python 對象
????python對象基礎
????????python對象特性
????????????所有的python對象都擁有三個特性:
????????????????- 身份:每一個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數id()來得到
????????????????????>>> a = 3
????????????????????>>> b = 3
????????????????????>>> id(a)
????????????????????146065560
????????????????????>>> id(b)
????????????????????146065560
????????????????- 類型:決定了該對象可以保存什么類型的值,可以進行什么樣的操作,以及遵循什么樣的規則。用內建函數type()查看對象的類型
????????????????????>>> a = 1
????????????????????>>> type(a)
????????????????????<type 'int'>
????????????????????>>> a = 'hello'
????????????????????>>> type(a)
????????????????????<type 'str'>
????????????????????>>> a = []
????????????????????>>> type(a)
????????????????????<type 'list'>
????????????????- 值:對象表示的數據項
????????python對象屬性
????????????某些python對象有屬性、值或相關聯的可執行代碼
????????????用.標記法來訪問屬性
????????????最常用的屬性是函數和方法,不過有一些python類型也有數據屬性
????????????含有數據屬性的對象包括(但不限于):類、類實例、模塊、復數和文件
????python對象類型
????????標準類型
????????????數字
????????????????- 整型
????????????????- 長×××
????????????????- 布爾型
????????????????- 浮點型
????????????????- 復數型
????????????字符串
????????????列表
????????????元組
????????????字典
????????其他內建類型
????????????在python開發時,還可能用到的數據類型有:
????????????????- 類型
????????????????- Null對象(None)
????????????????- 文件
????????????????- 集合/固定集合
????????????????- 函數/方法
????????????????- 模塊
????????????????- 類
????????內部類型
????????????以下類型通常用不到,只是為了知識的完整性,簡要的列出:
????????????????- 代碼
????????????????- 幀
????????????????- 跟蹤記錄
????????????????- 切片
????????????????- 省略
????????????????- xrange
????標準類型運算符
????????????對象值的比較
| 運算符 | 功能 |
| expr1? < expr2 | expr1小于expr2 |
| expr1 > expr2 | expr1 大于expr2 |
| expr1 <= expr2 | expr1 小于等于expr2 |
| expr1 >= expr2 | expr1 大于等于expr2 |
| expr1 == expr2 | expr1 等于expr2 |
| expr1 != expr2 | expr1 不等于expr2 |
| expr1 <> expr2 | expr1 不等于expr2 |
????????????對象身份比較
????????????????對象可以通過引用被賦值到另一個變量
??? ????????????因為每個變量都指向同一個(共享的)數據對象,只要任何一個引用發生改變,該對象的其他引用也會隨之改變
????????????????????>>> aList = ['hello','bob']
????????????????????>>> bList = aList
????????????????????>>> id(aList)
????????????????????3071001644L
????????????????????>>> id(bList)
????????????????????3071001644L
????????????????????>>> bList[1] = 'tom'
????????????????????>>> aList
????????????????????['hello', 'tom']
????????????布爾邏輯運算符
????????????????not運算符擁有最高優先級,只比所有比較運算符低一級
????????????????and 和 or 運算符則相應的在低一級
| 運算符 | 功能 |
| not expr | expr的邏輯非(否) |
| expr1 and expr2 | expr1 和expr2 的邏輯與 |
| expr1 or expr2 | expr1 和expr2的邏輯或 |
數字
????數字簡介
????????創建數值對象并賦值
????????????數字提供了標量貯存和直接訪問
????????????創建數值對象和給變量賦值一樣簡單
????????????????>>> anint = 1
????????????????>>> aLong = -9999999999999999999999L
????????????????>>> aFloat = 3.141325677839900349
????????????????>>> aComplex = 1.23 + 4.56J
????????更新數字對象
????????????數字是不可變類型,也就是說變更數字的值會生成新的對象
????????????在python中,變量更像一個指針指向裝變量值的盒子
??? ????????對不可變類型來說,你無法改變盒子的內容,但你可以將指針指向一個新盒子
????????????????>>> i? =3
????????????????>>> id(i)
????????????????146065560
????????????????>>> i = 4
????????????????>>> id(i)
????????????????146065548
????????刪除數字對象
????????????按照python的法則,無法真正刪除一個數值對象,僅僅是不再使用它而已
????????????刪除一個數值對象的引用,使用del語句
????????????刪除對象的引用之后,就不能再使用這個引用(變量名),除非給它賦一個新值
????????????絕大多數情況下并不需要明確del一個對象
????×××
????????布爾型
????????????該類型的取值只有兩個,即True和False
????????????True的數值為1,False的數值為0
????????????在判斷語句中,空列表、空元組、空字符串、空字典數值為0的數字以及None皆為Fasle,其他皆為True
????????????????>>> True + 2
????????????????3
????????????????>>> if "hello": print 'Yes'
????????????????...
????????????????Yes
????????????????>>> if not []: print 'yes'
????????????????...
????????????????yes
????????標準整數類型
????????????標準整數類型是最通用的數字類型
????????????python標準整數類型等價于C的(有符號)長整型
????????????整數一般以十進制表示
????????????如果八進制整數以數字“0”開始,十六進制整數以“0x” 或“0X”開始,二進制整數以“0b”或“0B”開始
????????????????>>> 0x10
????????????????????16
????????????????????>>> 010
????????????????????8
????????????????????>>> 0b10
????????????????????2
????????長整型
??? ????????C或其他編譯型語言的長整數類型的取值范圍是32位或64位
????????????python的長整數類型能表達的數值僅僅與機器支持的(虛擬)內存大小有關
????????????在一個整數值后面加個L(大寫或小寫都可以),表示這個整數十長整型
????????????這個整數可以是十進制,八進制,或十六進制
???
????運算符
?????? 標準類型運算符
????????????在做數值運算時,必須努力保證操作數是合適的數據類型
????????????相同類型數值運算,得到的結果也是該類型的數值
??? ????????不同類型數值運算,需要(顯示或隱式地)做數據類型轉換
????????????????????>>> print 5/3
????????????????????1
????????????????????>>> print 5.0 /3
????????????????????1.66666666667
????????混合模式運算符
????????算術運算符
????????????python支持單目運算符正號(+)和負號(-)
????????????雙目運算符,+、-、*、/、%,還有**,分別表示加法,減法,乘法,除法,取余和冪運算
??? ????????從python2.2起,還增加了一種新的整除運算符//,即地板除
????????????????>>> print 3.0/2
????????????????1.5
????????????????>>> print 3.0 // 2
????????????????1.0
????????????????>>> print round(3.0/2)
????????????????2.0
????????位運算符
????????? 位運算符只適用于整數
| 位運算符 | 功能 |
| ~num | 單目運算,對數的每一位取反 |
| num1 << num2 | num1 左移 num2位 |
| num1 >> num2 | num1 右移num2位 |
| num1 & num2 | num1 與num2按位與 |
| num1 ^ num2 | num1 異或 num2(相同為0,不同為1) |
| num1 | num2 | num1 與num2 按位或 |
?? ????
????內建函數
????????標準類型函數
????????????cmp(num1,num2)
????????????????- num1 大于num2結果為正值
????????????????- num1 小于num2 結果為負值
??? ????????????- num1 等于num2 結果為0
????????????str(num):將num轉換成字符串表示格式
????????????type(obj):判斷obj類型
????????數字類型函數
????????????函數int(),long(),float()和complex()來將其它數值類型轉換為相應的數值類型
?????????????? int('11') 默認十進制
????????????????int('11',base=2) 二進制
????????????????int('11',base=16)十六進制
????????????abs():返回給定參數的絕對值;abs(10),abs(-10)
????????????divmod():內建函數把除法和取余運算結合起來,返回一個包含商和余數的元組
????????????????>>> divmod(5,3)
????????????????(1, 2)
????????????pow():進行指數運算
????????????????????>>> pow(3,2)
????????????????????9
????????????????????>>> pow(2,3)
????????????????????8
????????????round():用于對浮點數進行四舍五入運算
????????????????????>>> print 5 / 3.0
????????????????????1.66666666667
????????????????????>>> print round(5 / 3.0)
????????????????????2.0
????????????????????>>> print round(5 / 3.0,2)? #保留兩位小數點。
????????????????????1.67
????????僅用于整數的函數
????????????hex():轉換為字符串形式的十六進制數? eg:ex(100)
????????????oct():轉換為字符串形式的八進制數 ?eg:oct(100)
????????????bin():轉換為字符串形式的二進制數 ?eg:?bin(100)??
????????????ord():接受一個字符,返回其對應的ASCII值 ?eg:ord('a')
????????????chr():接受一個單字節ASCII碼整數值,返回一個字符串 eg:chr(65)????
模塊psutil的使用
pip install psutil
import tab
import psutil
psutil.<tab><tab>
psutil.users()
psutil.used_phymem()
psutil.used_phymem() / 1024 / 1024
import os
os.system('free -m')
psutil.boot_time()
import time
psutil.disk_partitions()
psutil.disk_partitions()[0]
a = psutil.disk_partitions()[0]
type(a)
a.mountpoint
# pip install ecdsa
# pip install pycrypto
一個修改密碼的腳本
#!/bin/bash
if [ -z "$3"]; then
??? echo "Usage: $0 ipfile oldpass newpss"
??? exit 1
fi
ipfile=$1
oldpass=$2
newpass=$3
if [ ! -f $ipfile ]; then
??? ehco "$ipfile does not exists"
??? exit 2
fi
for ip in $(cat $ipfile)
do
??? expect << EOF
??????? spawn ssh root@ip "echo $newpass | passwd --stdin root"
??????? expect "(yes/no)?"{
?????????? send "yes\r"
?????????? expect "password:"
?????????????? send "$oldpass\r"
?????? } "password:" {send "$oldpass\r"}
??????? expect eof
EOF
done
python程序實現(改密碼/執行遠程命令)
#!/usr/bin/env python
import sys
import paramiko
def remote_comm(host,pwd,comm):
??? ssh = paramiko.SSHClient()
??? ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
??? ssh.connect(host,username='root',password=pwd)
??? stdin,stdout,stderr = ssh.exec_command(comm)
??? print stdout.read()
??? print stdout.read()
if __name__ =='__main__':
??? if len(sys.argv) != 4:
??????? print "Usage: %s ipfile oldpass newpass" %sys.argv[0]
??? else:
??????? ipfile =? sys.argv[1]
??????? oldpass = sys.argv[2]
??????? newpass = sys.argv[3]
??????? ch_pwd = "echo %s | passwd --stdin root" % newpass
??????? fobj = open(ipfile)
??????? for line in fobj:
??????????? ip = line.strip()?? #去除字符串兩端空白
??????????? remote_comm(ip,oldpass,ch_pwd)
多線程版python(改密碼/執行遠程命令)
#!/usr/bin/env python
import sys
import paramiko
import threading
def remote_comm(host,pwd,comm):
??? ssh = paramiko.SSHClient()
??? ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
??? ssh.connect(host,username='root',password=pwd)
??? stdin,stdout,stderr = ssh.exec_command(comm)
??? print stdout.read(),
??? print stderr.read(),
if __name__ =='__main__':
??? if len(sys.argv) != 4:
??????? print "Usage: %s ipfile oldpass newpass" %sys.argv[0]
??? else:
??????? ipfile =? sys.argv[1]
??????? oldpass = sys.argv[2]
??????? newpass = sys.argv[3]
??????? ch_pwd = "echo %s | passwd --stdin root" % newpass
??????? fobj = open(ipfile)
??????? for line in fobj:
??????????? ip = line.strip()?? #去除字符串兩端空白
??????????? t = threading.Thread(target=remote_comm,args=(ip,oldpass,ch_pwd
????????????????????????????????????????????????????????? ))
??????????? t.start()
轉載于:https://blog.51cto.com/sailq21/1858651
總結
以上是生活随笔為你收集整理的python 学习笔记day03-python基础、python对象、数字、函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 要做的题目-要用到hadoop资源
- 下一篇: 来自NASA的全球高程DEM数据