python基礎第二課

一  認識模塊

1.1  syshtml

#!/usr/bin/env python3
# Author: Sam Gao
import sys
print(sys.path) #打印PYTHONPATH環境變量
# ['/home/sam/PycharmProjects/s14/day1',
# '/home/sam/PycharmProjects/s14',
# '/usr/lib/python35.zip',
# '/usr/lib/python3.5',
# '/usr/lib/python3.5/plat-x86_64-linux-gnu',
# '/usr/lib/python3.5/lib-dynload',
# '/usr/local/lib/python3.5/dist-packages',
# '/usr/lib/python3/dist-packages']

print(sys.argv)#  使用console 執行 python3 sys_mokuai.py test you are
# 結果   ['sys_mokuai.py', 'test', 'you', 'are']
print(sys.argv[2])   #  結果    you

1.2  osjava

import os
print(os.system("ifconfig | grep 10.100 |awk '{print $2}'"))   # 執行系統命令,,並返回狀態結果
#結果
# 10.100.211.48
# 0

print(os.popen("ifconfig | grep 10.100 |awk '{print $2}'").read())  #返回命令執行的結果
#1  os.popen("ifconfig | grep 10.100 |awk '{print $2}'")  返回內存地址,即把結果存進地址,使用read()讀出了
#結果
#10.100.211.48

1.3  案例 把參數看成命令執行node

[root@linux-node1 ~]# cat test.py 
#!/usr/bin/env python
# -*- coding: gbk -*-
import os,sys
os.system(' '.join(sys.argv[1:]))
[root@linux-node1 ~]# python test.py ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.130.128  netmask 255.255.255.0  broadcast 192.168.130.255
        inet6 fe80::20c:29ff:fec1:295a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c1:29:5a  txqueuelen 1000  (Ethernet)
        RX packets 181757  bytes 20497644 (19.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29679  bytes 2669636 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

二  自定義模塊及pyc

2.1  自定義模塊python

[root@linux-node1 ~]# cat test.py
#!/usr/bin/env python
print 'Hello World!'
[root@linux-node1 ~]# cat test2.py 
#!/usr/bin/env python
import test
[root@linux-node1 ~]# python test2.py
Hello World!

注:test.py 必須放在環境變量的目錄裏,可以使用print sys.path 查詢,通常放在當前目錄或者放在E:\Python36\Lib\site-packages 目錄下,在E:\Python36\Lib\site-package\_pycache_   多了test.pyc linux

2.2  認識pycgit

2.2.1  Python是一門解釋型語言?api

我初學Python時,聽到的關於Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc文件的存在。若是是解釋型語言,那麼生成的*.pyc文件是什麼呢?c應該是compiled的縮寫纔對啊!app

爲了防止其餘學習Python的人也被這句話誤解,那麼咱們就在文中來澄清下這個問題,而且把一些基礎概念給理清。ide

2.2.2 解釋型語言和編譯型語言
函數

計算機是不可以識別高級語言的,因此當咱們運行一個高級語言程序的時候,就須要一個「翻譯機」來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分紅兩類,第一種是編譯,第二種是解釋。

編譯型語言在程序執行以前,先會經過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不須要翻譯,而直接執行就能夠了。最典型的例子就是C語言。

解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,經過解釋器對程序逐行做出解釋,而後直接運行,最典型的例子是Ruby。

經過以上的例子,咱們能夠來總結一下解釋型語言和編譯型語言的優缺點,由於編譯型語言在程序運行以前就已經對程序作出了「翻譯」,因此在運行時就少掉了「翻譯」的過程,因此效率比較高。可是咱們也不能一律而論,一些解釋型語言也能夠經過解釋器的優化來在對程序作出翻譯時對整個程序作出優化,從而在效率上超過編譯型語言。

此外,隨着Java等基於虛擬機的語言的興起,咱們又不能把語言純粹地分紅解釋型和編譯型這兩種。

用Java來舉例,Java首先是經過編譯器編譯成字節碼文件,而後在運行時經過解釋器給解釋成機器文件。因此咱們說Java是一種先編譯後解釋的語言。

2.2.3  Python究竟是什麼

其實Python和Java/C#同樣,也是一門基於虛擬機的語言,咱們先來從表面上簡單地瞭解一下Python程序的運行過程吧。

當咱們在命令行中輸入python hello.py時,實際上是激活了Python的「解釋器」,告訴「解釋器」:你要開始工做了。但是在「解釋」以前,其實執行的第一項工做和Java同樣,是編譯。

熟悉Java的同窗能夠想一下咱們在命令行中如何執行一個Java的程序:

javac hello.java

java hello

只是咱們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也同樣,當咱們執行python hello.py時,他也同樣執行了這麼一個過程,因此咱們應該這樣來描述Python,Python是一門先編譯後解釋的語言。

2.2.4 簡述Python的運行過程

在說這個問題以前,咱們先來講兩個概念,PyCodeObject和pyc文件。

咱們在硬盤上看到的pyc天然沒必要多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。咱們先簡單知道就能夠了,繼續向下看。

當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。

當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,若是找到,則直接載入,不然就重複上面的過程。

因此咱們應該這樣來定位PyCodeObject和pyc文件,咱們說pyc文件實際上是PyCodeObject的一種持久化保存方式。

 

三  bytes類型

python3最重要的新特性大概要算對文本和二進制數據作了更爲清晰的區分,文本老是unicode字符集,有str類型表示,二進制數據則有bytes類型表示。python3不會以任何隱式的方式混用str和bytes,正是這是的這二者的區別特別明顯,你不能拼接字符串和字節包,也沒法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然);咱們不關心字符串在內部是如何被表示的,也不關心它用幾個字節來表示每一個字符。只有在將字符串編碼成字節(如用於通訊信道的傳輸)或將字節解碼成字符串時,才考慮這些問題。

 

 

 3.1  建立bytes類型數據

>>> a = bytes([1,2,3,4])
>>> a
b'\x01\x02\x03\x04'
>>> type(a)
<class 'bytes'>
>>>
>>> a = bytes('hello','ascii')
>>> a
b'hello'
>>> type(a)
<class 'bytes'>

3.2  按utf-8的方式編碼,轉成bytes以及解碼成字符串

>>> a = 'hello world'
>>> type(a)
<class 'str'>
>>> a
'hello world'
>>> b = a.encode(encoding='utf-8')
>>> type(b)
<class 'bytes'>
>>>
>>> b
b'hello world'
>>>
>>>
>>> c = b.decode(encoding='utf-8')
>>> type(c)
<class 'str'>
>>> c
'hello world'
msg = "我愛你"
print(msg)  # 我愛你
print(msg.encode(encoding='utf-8'))  # b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
print(b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'.decode(encoding='utf-8'))   # # 我愛你

參考自:http://www.cnblogs.com/zanjiahaoge666/p/6402907.html

 

四  三元運算

>>> grilF = 'Snow' if 2 > 1 else 'Jey'
>>> grilF
'Snow'
>>> grilF = 'Snow' if 2 < 1 else 'Jey'
>>> grilF
'Jey'

 

五  數字及布爾值

5.1  數字

int(整型)在32位機器上,整數的位數爲32位;在64位系統上,整數的位數爲64位

long(長整型)自從Python2.2起,若是整數發生溢出,Python會自動將整數數據轉換爲長整數,因此現在在長整數數據後面不加字母L也不會致使嚴重後果了。pyhton 3X沒有長整型

float(浮點型浮點數用來處理實數,即帶有小數的數字。

complex(複數)複數由實數部分和虛數部分組成,通常形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。

5.2  布爾值   真或假  1 或 0

 

六  字符串

6.1  字符串具備不可改變的特性

>>> str1 = 'your'
>>> str1 = str1 + 'name'
>>> str1
'yourname'

當執行第二行的時候,在內存裏又開闢了一個空間存儲"yourname",而不是在原來存儲「your」的地方修改,使得str1指向這個新地址

6.2  切片

>>> str='my name is sam, and i love girl'
>>> str[1]
'y'
>>> str[3:7]
'name'
>>> str[-4:]    #截取最後4個字符
'girl'
>>> str[-1:-5:-1]    #反序截取
'lrig'

6.3  字符串長度

>>> str='my name is sam, and i love girl'
>>> len(str)
31

6.4  包含

>>> str='my name is sam, and i love girl'  
>>> 'name' in str       #  不存在則報錯
True
>>> 'tiger' not in str
True

6.5  循環

>>> str='your name'
>>> for i in str:
...     print(i)
...
y
o
u
r
n
a
m
e

6.6  字符串其它方法

6.6.1  count

>>> 'your name, ming zi'.count('n')
2
>>> 'your name, ming zi'.count('n',6)
1
>>> 'your name, ming zi'.count('n',6,8)
0

6.6.2  capitalize

>>> "youy name".capitalize()
'Youy name'

6.6.3  center

>>> "youy name".center(50,'-')
'--------------------youy name---------------------'

6.6.4  encode

>>> "youy name".encode(encoding='utf-8')
b'youy name'

6.6.5  endwith

>>> "youy name".endswith("me")
True

6.6.6  expandtabs

>>> "\tyouy name".expandtabs(10)
'          youy name'

6.6.7  format

>>> "I am %s, %d year old, I love %s" % ('Sam',12, 'dog')
'I am Sam, 12 year old, I love dog'
>>> "I am {}, {} year old, I love {}".format('Sam',12, 'dog')
'I am Sam, 12 year old, I love dog'
>>> "I am {2}, {0} year old, I love {1}".format(12,'dog', 'Sam')
'I am Sam, 12 year old, I love dog'
>>> "I am {name}, {age} year old, I love {dong}".format(name='Sam',age=12, dong='dog')
'I am Sam, 12 year old, I love dog'

注:%s字符串,%d整型,%f浮點數

6.6.8  format_map

>>> 'My name is {name}, I am {age} year old'.format_map({'name': 'Sam', 'age': 23})
'My name is Sam, I am 23 year old'

6.6.9  find左邊找    rfind右邊找

>>> 'My name is Sam, I am 23 year old'.find('a')  # 左邊找
4
>>> 'My name is Sam, I am 23 year old'.find('a',5)
12
>>> 'My name is Sam, I am 23 year old'.find('a',13, 19)
18
>>> 'yui'.find('l')  # 找不到則返回-1
-1
 
>>> 'My name is Sam, I am 23 year old'.rfind('a')  # 右邊找
26

6.6.10  index

>>> 'My name is Sam, I am 23 year old'.index('a')
4
>>> 'My name is Sam, I am 23 year old'.index('a',5)
12
>>> 'My name is Sam, I am 23 year old'.index('a', 13, 19)
18
>>> 'yui'.index('l')  # 找不到則,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

6.6.11  isalnum 檢查判斷字符串是否包含字母數字字符

>>> 'name'.isalnum()
True
>>> '12'.isalnum()
True
>>> 'AAB'.isalnum()
True
>>> '!fff'.isalnum()
False

6.6.12  isalpha檢測字符串是否只由字母組成

>>> 'asdf'.isalpha()
True
>>> '1234'.isalpha()
False
>>> 'gh67'.isalpha()
False

6.6.13  isdecimal  非負整數 檢查字符串是否只包含十進制字符。這種方法只存在於unicode對象

>>> 'ghjjj'.isdecimal()
False
>>> '12'.isdecimal()
True
>>> '12.7'.isdecimal()
False

6.6.14  isdigit   非負整數     檢測字符串是否以數字組成

>>> '12'.isdigit()
True
>>> '12.8'.isdigit()
False
>>> '-12'.isdigit()
False
>>> '0'.isdigit()
True

6.6.15  isidentifier  檢測字符串是否以字母開頭

>>> 'hhh'.isidentifier()
True
>>> '77'.isidentifier()
False
>>> '!@'.isidentifier()
False
>>> '7ggg'.isidentifier()
False

6.6.16  islower   lower

>>> 'AhhBgggG'.islower()
False
>>> 'hhhhh'.islower()
True

6.6.17   isnumeric    檢測字符串是否只由數字組成。這種方法是隻針對unicode對象。

>>> '678'.isnumeric()
True
>>> '678.9'.isnumeric()
False
>>> '678.0'.isnumeric()
False

6.6.18  isprintable    判斷字符串中全部字符是否都屬於可見字符

>>> 'hyyuuuu\nyyyyyy'.isprintable()
False
>>> 'hyyuuuuyyyyyy'.isprintable()
True

6.6.19   isspace     檢測字符串是否爲空格

>>> 'jjjiiii'.isspace()
False
>>> ' '.isspace()
True

6.6.20   istitle    判斷字符串是否適合看成標題(其實就是每一個單詞首字母大寫)  title

>>> 'Your Name'.istitle()
True

6.6.21  isupper    判斷字符串中全部字母字符是否都是大寫字母   upper

>>> 'fghhh'.isupper()
False
>>> 'FGGGGG'.isupper()
True

6.6.22  join   字符串列表鏈接

>>> '+'.join('string')
's+t+r+i+n+g'
>>> '+'.join(['i', 'am', 'your'])
'i+am+your'

6.6.23  strip lstrip rstrip  移除左右  空格  換行符

str = '  ggggggggggg    \n'
print(str)
print(str.strip())
print(str.lstrip())
print(str.rstrip())
print('````````````')

6.6.24  ljust  rjust   與center 相似

>>> 'name'.ljust(50, '*')
'name**********************************************'
>>> 'name'.rjust(50, '*')
'**********************************************name'

6.6.25  lower   將字符串的大寫換成小寫  islower

>>> 'ASDF'.lower()
'asdf'
>>> 'AS7766!DF'.lower()
'as7766!df'

6.6.26  maketrans  translate

>>> tab = str.maketrans('abc','123')
>>> 'i am your hero sb'.translate(tab)
'i 1m your hero s2'

6.6.27  partition   rpartition  若是分隔符包含在字符串中,返回一個元組,第一個爲分隔符左邊字符串,第二個爲分隔符,第三個爲右邊字符串

>>> 'zxcvbnvbhjuu'.partition('vb')  # 匹配左邊的
('zxc', 'vb', 'nvbhjuu')
>>> 'zxcvbnvbhjuu'.partition('pp')
('zxcvbnvbhjuu', '', '')
>>> 'zxcvbnvbhjuu'.rpartition('vb') # 匹配右邊的
('zxcvbn', 'vb', 'hjuu')
>>> 'zxcvbnvbhjuu'.rpartition('pp')
('', '', 'zxcvbnvbhjuu')

6.6.28  replace

>>> 'your name, i am a boy'.replace('a', 'B')
'your nBme, i Bm B boy'
>>> 'your name, i am a boy'.replace('a', 'B', 1)
'your nBme, i am a boy'

6.6.29  split   rsplit

>>> 'your name, i am a boy'.split('a')
['your n', 'me, i ', 'm ', ' boy']
>>> 'your name, i am a boy'.split('a',2)  # 從左邊劃分
['your n', 'me, i ', 'm a boy']
>>> 'your name, i am a boy'.rsplit('a',2)  # 從右邊劃分
['your name, i ', 'm ', ' boy']

6.6.30  splitlines

>>> '''My name\n is Sam, I am\n 23 year old'''.splitlines()
['My name', ' is Sam, I am', ' 23 year old']

6.6.31  startswith

>>> 'My name is Sam, I am 23 year old'.startswith('My',4,10)
False
>>> 'My name is Sam, I am 23 year old'.startswith('me',4,10)
False
>>> 'My name is Sam, I am 23 year old'.startswith('ame',4,10)
True

6.6.32  swapcase

>>> 'ASfrtAAggg'.swapcase()
'asFRTaaGGG'

6.6.33  title   istitle

>>> 'you name'.title()
'You Name'

6.6.34  upper   isupper

>>> 'i am your hero sb'.upper()
'I AM YOUR HERO SB'

6.6.35  zfill

>>> "youy name".zfill(50)
'00000000000000000000000000000000000000000youy name'

 

七  列表

#!/usr/bin/env python3
# encoding: utf-8
# Author: Sam Gao

#列表基礎
# 1. 空列表
names = []

#2
names = ['zhang', 'liu', 'xiang', 'xu']


# 查找
print(names)   #  ['zhang', 'liu', 'xiang', 'xu']
print(names[3])   # xu


print(names[-2])   #  取倒數第二位   xiang
print(names[-2:])  #  取最後兩位   ['xiang', 'xu']
print(names[2:])   #  取names[2] 自己  及之後的元素  ['xiang', 'xu']
print(names[1:3])   #  取names[1]  names[2],   但不包括names[3].    ['liu', 'xiang']


#默認從左到右取
print(names[-1::-1])   # 右到左   ['xu', 'xiang', 'liu', 'zhang']

#跨兩個元素取   步長切片
print(names[::2])


#names = ['zhang', 'liu', 'xiang', 'xu', 'liu']
#print(names.index('liu')) #    返回元素的下標  1
#print(names.count('liu'))   # 返回元素的個數   2
# names.reverse()   # 反轉
# names.sort()   # 排序, 按照ascii 排序

#print(names)


# 增長
#1
names.append("gao")  #加到最後
print(names)   # ['zhang', 'liu', 'xiang', 'xu', 'gao']

#2
names.insert(2, 'wang')   # 插到第二位, 並後面的元素向後移動一位
print(names)  # ['zhang', 'liu', 'wang', 'xiang', 'xu', 'gao']

#3
# names2 = ['du', 'zi']
# names.extend(names2)  #  增長列表
# print(names)   # ['zhang', 'liu', 'wang', 'xiang', 'xu', 'gao', 'du', 'zi']


# 修改
names[2] = 'zhou'
print(names, names[2])  #  ['zhang', 'liu', 'zhou', 'xiang', 'xu', 'gao'] zhou

# 刪除
#1
names.remove("liu")
print(names)   # ['zhang', 'zhou', 'xiang', 'xu', 'gao']
#2
del names[0]  #
print(names)   # ['zhou', 'xiang', 'xu', 'gao']
#3
names.pop()  # 默認刪除最後一位
print(names)  #  ['zhou', 'xiang', 'xu']
names.pop(1)  # 刪除數字標號爲1 的元素
print(names)  #  ['zhou', 'xu']
#4
# names.clear()   # 清除列表




#  複製
names = ['zhang', 'liu', 'xiang', 'xu', 'liu']

#1  淺copy,只能copy 第一層
names2 = names.copy()
print(names2)     #  ['zhang', 'liu', 'xiang', 'xu', 'liu']

names[0] = ''
print(names)    # ['張',    'liu', 'xiang', 'xu', 'liu']
print(names2)   # ['zhang', 'liu', 'xiang', 'xu', 'liu']


names = ['zhang', 'liu', ['sam', 'yang'],'xiang', 'xu', 'liu']
names2 = names.copy()
print(names2)   # ['zhang', 'liu', ['sam', 'yang'], 'xiang', 'xu', 'liu']
names[2][0] = '山姆'
print(names)   # ['zhang', 'liu', ['山姆', 'yang'], 'xiang', 'xu', 'liu']
print(names2)  # ['zhang', 'liu', ['山姆', 'yang'], 'xiang', 'xu', 'liu']

# copy模塊
import copy
names2 = copy.copy(names)    #  == names.copy()  淺copy   ==  names2 = names[:]   == names2 = list(names)

names2 = copy.deepcopy(names)  #  深copy   徹底複製


# 循環
for i in names:
    print(i)

案例

#!/usr/bin/env python3
# encoding: utf-8
# Author: Sam Gao


commoditys = [('car', 10000), ('ipad', 5000), ('pen', 10), ('house', 5000)]

shopping_cart = []

while True:
    salary = input('pis input you salary:')
    if salary.isdigit():
        print('welcome shopping mall')
        blance = int(salary)
        break
    else:
        print('pls input valid salary!')



add_info = 'added [%s] to your shopping cart, your blance is \033[31;1m[%d]\033[0m'



while True:
    for commodity in commoditys:    # for index, item in enumerate(commoditys):
        print(commoditys.index(commodity), ":", commodity)

    user_chice = input("Do you want to shoppping? ")

    if user_chice.isdigit():
        user_chice = int(user_chice)
        if user_chice in range(len(commoditys)):
            select_commodity = commoditys[user_chice]
            if select_commodity[1] <= blance:
                blance -= select_commodity[1]
                shopping_cart.append(select_commodity[0])
                print(add_info % (select_commodity[0], blance))
            else:
                print("your current blance is not enugh")
        else:
            print('commodity is not in the list!')
    elif user_chice == 'q':
        print("-----------------shopping list------------------")
        for item in shopping_cart:
            print(item)
        print('------------------------------------------------')
        print('your current blance is %d' % blance)
        exit()
    else:
        print('invlid option')
View Code

 

八  元組

元組就是不可變的列表,只能讀取,不能修改

8.1  元組定義

>>> name=('Sam', 'Gao', 'jey')
>>> name
('Sam', 'Gao', 'jey')
>>> team=('ops',)
>>> team
('ops',)
>>> type(team)
<class 'tuple'>

8.2  元組只有兩種方法

names = ('gao', 'sam', 'gao')
names.count('gao')
names.index('gao') 

 

九  字典

#!/usr/bin/env python3
# encoding: utf-8
# Author: Sam Gao

info = {
    'stu1': 'gao',
    'stu2': 'liu',
    'stu3': 'ma',
    'stu4': 'cang'
}

print(info)  #  {'stu3': 'ma', 'stu1': 'gao', 'stu4': 'cang', 'stu2': 'liu'}
            # 字典是無序的

# 查找
print(info['stu2'])  #  liu   不存在則報錯
print(info.get('stu1'))  #     不存在不報錯,返回none

# 修改
info['stu1'] = 'wang'
print(info['stu1'])   #  wang

# 增長
info['stu5'] = 'mazi'


# 刪除
del info['stu1']
info.pop('stu2')
info.popitem()  # 隨便刪除


# 判斷
print('stu4' in info)

# 修改+增長
info = {
    'stu1': 'gao',
    'stu2': 'liu',
    'stu3': 'ma',
    'stu4': 'cang'
}
info.setdefault("stu1", "jey")  # 若是info 裏面存在stu1, 則修改。不存在,則增長

info1 = {
    'stu4': 'gao',
    'stu10': 'snow'
}
info.update(info1)   # 右則修改,沒有則增長


###  其它
info = {
    'stu1': 'gao',
    'stu2': 'liu',
    'stu3': 'ma',
    'stu4': 'cang'
}

print(info.items())  # dict_items([('stu4', 'cang'), ('stu1', 'gao'), ('stu3', 'ma'), ('stu2', 'liu')])  還有 keys()    values()

new_list = dict.fromkeys([1,2,3], 'test')   # {1: 'test', 2: 'test', 3: 'test'} 注: 全部的key 共享一個value   test ,即,內存地址同樣的
print(new_list)

# 循環
for i in info:
    print(i)
#結果stu2
# stu4
# stu1
# stu3

for k, v in info.items():
    print(k, v)

#結果
#stu2 liu
# stu4 cang
# stu1 gao
# stu3 ma

#注: 第一種循環要比第二種循環高效不少
相關文章
相關標籤/搜索