python基礎 習題總結

pyenv 編程題目總結(99乘法表 打印菱形與閃電 斐波那契數列 素數 猴子吃桃) 原反補碼與異或運算 list列表

定短期目標 未來一年內想達到什么樣的水平
網絡基礎知識 IP TCP OSI HTTP
大公司看重算法 (數據結構 圖論)
關系型數據庫Sql –> 非關系型數據庫NoSQL
WEB開發 前端可視化 JS
技術熟練以后 需要提高語言表達能力
Python怎么學
多寫 2萬行代碼
核心問題 網上帖子找不到答案 需要自己多思考 結合所學知識 用代碼實現
少看低水平博客 多查手冊
慎用刪除
用python3.5以上版本
java python c# 虛擬機語言
虛擬機:中間代碼 可跨操作系統,中間代碼再轉化為機器指令
CPython iPython
PyPy JIT技術 動態優化 編譯成本地代碼 類似C語言
Jython Python源代碼編譯成Java字節碼 可以跑在java虛擬機上
CentOS6 下python虛擬環境配置
CentOS6下默認為python2.6環境 不可升級 故考慮pyenv,該程序可提供python虛擬環境,方便項目部署和開發,同時不影響系統原有python.
STEP0 :pyenv使用編譯方式安裝 故需事先配置好編譯環境
yum -y install git gcc make patch gdbm-devel openssl-devel sqlite-devel
readline-devel zlib-devel bzip2-devel
STEP1: root用戶權限過大 pyenv設置不當會修改系統默認python版本 故創建普通用戶登錄運行pyenv
useradd python
STEP2: 以python用戶登錄以后安裝pyenv curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
提示:
1.https://github.com/pyenv/pyenv-installer 有安裝文檔的說明
2.若curl出現 curl: (35) SSL connect error ,是nss版本低的問題,更新它。需配置一個有較新包的yum源
[updates]
name=CentOS-Updates
baseurl=https://mirrors.aliyun.com/centos/6.9/os/x86_64
gpgcheck=0
然后更新nss # yum update nss
STEP3: 將pyenv的bin目錄加入環境變量
export PATH=”/home/python/.pyenv/bin:$PATH”
eval “$(pyenv init -)”
eval “$(pyenv virtualenv-init -)”
$ source ~/.bash_profile
STEP4: pyenv使用介紹
列出所有可用版本 $ pyenv install –list
在線安裝指定版本 $ pyenv install 3.5.3
提示:
這樣安裝可能較慢,為提速可選用cache方法。
使用緩存方式安裝 : 在~/.pyenv目錄下,新建cache目錄,放入下載好的待安裝版本的文件。
不確定要哪一個文件,把下載的3個文件都放進去??墒褂脁ftp或winscp等工具在windows與linux系統之間互傳文件.
[python@centos6 ~]$ ll .pyenv/cache/
total 55204
-rw-rw-r–. 1 python python 20656090 Mar 19 16:08 Python-3.5.3.tar.gz
-rw-rw-r–. 1 python python 15213396 Mar 19 16:08 Python-3.5.3.tar.xz
-rw-rw-r–. 1 python python 20656090 Mar 19 16:08 Python-3.5.3.tgz
隨后再運行pyenv install 3.5.3 命令就可以很快執行
版本控制
顯示當前的python版本$ pyenv version
顯示所有可用的python版本$ pyenv versions
global 全局設置 $ pyenv global 3.5.3 該命令會將系統全局的python指定為353版本. 故不推薦root用戶進行全局設置 CentOS6.5系統Python為2.6版本,使用了global就成了3.x,會帶來很不好的影響。 此時可使用 pyenv global system將全局python版本改為系統python版本
shell 會話設置 影響只作用于當前會話,退出ssh登錄就失效 $ pyenv shell 3.5.3
local 本地設置 在某一目錄執行 pyenv local 3.5.3 則從該目錄開始向下遞歸都繼承這一設置。
Virtualenv 虛擬環境設置
為什么要使用虛擬環境? 因為剛才使用的Python353環境都是一個公共的空間,如果多個項目使用不同Python版本開發,或者使用不同的Python版本部署運行,或者使用同樣的版本開發的但不同項目使
用了不同版本的庫,等等這些問題都會帶來沖突。最好的解決辦法就是每一個項目獨立運行自己的
“獨立小環境”中。
pyenv virtualenv 3.5.3 mag353 使用python3.5.3版本創建出一個獨立的虛擬空間。
$ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.3
3.5.3/envs/mag353
mag353
可以在版本列表中存在,就和3.5.3是一樣的,就是一個版本了。 真實目錄在~/.pyenv/versions
/下,以后只要使用這個虛擬版本,包就會按照到這些對應的目錄下去,而不是使用3.5.3。
[python@node ~]$ mkdir -p magedu/projects/web
[python@node ~]$ cd magedu/projects/web/
指定magedu/projects/web/目錄為ma353虛擬環境 該虛擬環境子目錄會繼承,父目錄則沒有
[python@node web]$ pyenv local mag353
(mag353) [python@node web]$ cd ..
[python@node projects]$ cd web/
總結:local與虛擬環境的區別: 后者獨立得更徹底. 前者只是版本獨立,后者還將軟件庫獨立. 即使是和前者相同版本,后者也可將項目所需的庫單獨存放. 而不影響這一版本的大環境.
pip 通用配置
pip是python的包管理器 默認連接python官方pypi網站,速度較慢.可指定為阿里云的pypi源:
linux下配置文件為~/.pip/pip.conf
windows下pip的配置文件為~/pip/pip.ini
pip.conf內容如下:
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com
安裝ipython
ipython 是增強的交互式Python命令行工具
pip命令安裝ipython $ pip install ipython
啟動ipython $ ipython
安裝Jupyter jupyter是基于WEB的交互式筆記本,其中可以非常方便的使用Python。 安裝Jupyter,也會安裝ipython.
$ pip install jupyter
$ jupyter notebook help
查看幫助命令可看到很多有用選項 如jupyter notebook password
$ jupyter notebook –ip=0.0.0.0 –no-browser
提示:若設置密碼以后輸入密碼無法登錄jupyter頁面 可將啟動jupyter窗口后提示信息里的token值粘貼至web頁面
原碼 反碼 補碼 負數的表示
原碼:符號位+數值位
最高位為符號位 正數符號位為0 負數符號位為1
如8的原碼為0 1000 -7的原碼為1 0111
正數的反碼和補碼均與原碼相同
負數的反碼為 符號位不變 數值位按位取反
負數的補碼為 在負數的反碼基礎上再加1
數字在計算機中以補碼形式存儲
+7? 符號位0?數值為111
0111
-7?符號位1?數值位111
1111
反碼1000
補碼1001

假設有一個數~9,計算步驟如下,9=1001

其補碼為01001,

對其取反10110,這個數是在內存中存放的,現在需要裝換成原碼,既先減1,然后取反得

11010,符號位為1是負數,即-10

10^9表示10和9原碼對應二進制位進行異或運算
異或運算的法則為:相同得0 不同得1
10 ? ?0000 1010
9 ? ? ?0000 1001
異或0000 0011
最后結果為3
10 0000 1010
-9 1000 1001
異或 1000 0011
最后結果為-3
python基礎 習題總結
內存管理
引用計數
垃圾回收 Garbage Collection 簡稱GC 慎用!!!
python基礎 習題總結盡量少占用內存 內存占用過大會引起GC 影響程序性能
打印99乘法表
”’
打印99乘法表 需注意多處細節
1 根據左右上下三角分別確定行和列的上下限
2 輸出結果可直接使用print函數 或對字符串進行拼接再打印
3 注意print函數的兩種分隔符設定print(value, …, sep=’ ‘, end=’\n’,)
4 注意print函數默認為左對齊 若想右對齊 需使用print(‘{:>72}’.format())形式設定左右對齊方式(>表示右對齊)以及最長行占位數(72)
”’
for i in range(1,10):
for j in range(1,i+1):
print(j,’x’,i,’=’,i*j,sep=”,end=’\t’)
print()
print(‘————————————————————————-‘)
for i in range(1,10):
line=”
for j in range(i,10):
line+='{}x{}={:<2} ?‘.format(i,j,i*j)
print(‘{:>72}’.format(line))
print(‘————————————————————————‘)
”’最后一種右對齊不用format 需要更復雜的邏輯判斷
1 乘積大于9的末尾空兩格 小于等于9的空三格
2 因此每項式子的寬度都是8 為實現右對齊 可在列較少的行事先打印出空格,并關閉print本行的換行功能
至于空格數量 則是(i-1)*8 因為需補空格的數量剛好比行號i少1
3 此題不可眼高手低 需認真判斷行列號的范圍 并適當調整空格數
”’
for i in range(1,10):
print(‘ ‘*(i-1)*8,sep=’ ?‘,end=”)
for j in range(i,10):
product=i*j ?#product是乘積的英文
if product>9:
end=’ ?‘
else:
end=’ ? ‘
print(i,’x’,j,’=’,product,sep=”,end=end)
print()
輸入若干數字 最后輸出最大值或平均值
”’
輸入若干數字 最后輸出最大值 可用以下代碼實現
while True:
s=input(‘>>>’)
if s:
pass
else:
break
注意不要形成s=int(input(‘>>>’))的思維定式 若要求輸入若干數字
應采用以上辦法 輸入為空則停止循環
”’
count=0
sum=0
while True:
s=input(‘>>>’)
if s:
count+=1
sum+=int(s)
print(‘ave is ‘,sum/count)
else:
break
m=int(input(‘>>>’))
while True:
s=input(‘>>>’)
if s:
n=int(s)
if n>m:
m=n
print(‘max is ‘,m)
else:
# print(‘max is ‘,m)
break
打印菱形
”’
? ? ?*
? ?***
? *****
*******
? *****
? ?***
? ? ?*
以下為規律分析:
用print函數打印 print為左對齊
故只需考慮 行號L 左側空白數b 星號數s的數學關系即可
行號L ?空白數b 星號數s ?循環行號i
? 1 ? ? ? 3 ? ? ? 1 ? ? ? ?-3
? 2 ? ? ? 2 ? ? ? 3 ? ? ? ?-2
? 3 ? ? ? 1 ? ? ? 5 ? ? ? ?-1
? 4 ? ? ? 0 ? ? ? 7 ? ? ? ? 0
? 5 ? ? ? 1 ? ? ? 5 ? ? ? ? 1
? 6 ? ? ? 2 ? ? ? 3 ? ? ? ? 2
? 7 ? ? ? 3 ? ? ? 1 ? ? ? ? 3
規律總結
設總行數為n hn=n//2
i=L-4 故range函數可寫為range(-hn,n-hn)
b=abs(i)
s=n-2*b
乘2 除2 最好用位運算<<1 >>1代替
下面倒三角的規律只需做小改動
建議將不同的項目分開寫 改變量名很麻煩也很容易出錯
?*******
? *****
? ?***
? ? *
? ?***
? *****
?*******
? ”’
n=9
hn=n>>1
for i in range(-hn,n-hn):
b=abs(i)
s=n-(b<<1)
print(‘ ‘*b,’*’*s)
nd=7
hnd=nd>>1
for i in range(-hnd,nd-hnd):
? bd=hnd-abs(i)
? sd=nd-(bd<<1)
? print(‘ ‘*bd,’*’*sd)
打印閃電
”’
? ?*
? **
?***
*******
? ?***
? ?**
? ?*
以下為規律分析:
用print函數打印 print為左對齊
故只需考慮 行號L 左側空白數b 星號數s的數學關系即可
行號L ?空白數b 星號數s ?循環行號i
? 1 ? ? ? 3 ? ? ? 1 ? ? ? ?-3
? 2 ? ? ? 2 ? ? ? 2 ? ? ? ?-2
? 3 ? ? ? 1 ? ? ? 3 ? ? ? ?-1
? 4 ? ? ? 0 ? ? ? 7 ? ? ? ? 0
? 5 ? ? ? 3 ? ? ? 3 ? ? ? ? 1
? 6 ? ? ? 3 ? ? ? 2 ? ? ? ? 2
? 7 ? ? ? 3 ? ? ? 1 ? ? ? ? 3
規律總結
設總行數為n hn=n//2
i=L-4 故range函數可寫為range(-hn,n-hn)
i<0
b=-i
s=n-hn+i
i=0
b=-i
s=n
i>0
b=hn
s=n-hn-i
”’
n=7
hn=n>>1
for i in range(-hn,n-hn):
if i<0:
b=-i
s=n-hn+i
elif i==0:
b=-i
s=n
else:
b=hn
s=n-hn-i
print(‘ ‘*b+’*’*s)
猴子吃桃問題
”’
猴子吃桃問題可用逆向思維(加一再乘二)實現
但應注意循環的次數是9次而不是10次
”’
last=1
for i in range(9):
last=(last+1)<<1
print(last)
100以內的斐波那契數列
a=1
b=1
c=0
print(a,b,sep=’\n’,end=’\n’)
while True:
c=a+b
if c>100:
break
a=b
b=c
print(c)
”’
根據斐波那契數列的定義 下次加和時前兩位數各向后推一位
這句話翻譯為編程語言就是a=b b=c 需好好體會
”’
斐波那契數列的第101項
# n=int(input(‘nst of fbnq>>>’))
n=101
a=1
b=1
# c=0
if n==1:
print(a)
elif n==2:
print(b)
else:
for i in range(n-2):
c=a+b
a=b
b=c
print(c)
判斷質數
a=int(input(‘輸入一個數,判斷是否為質數’))
if a<2:
print(‘注意,0和1既非素數也非合數’)
elif a==2:
print(a,’是質數’)
else:
for i in range(2,int(a**0.5)+1):
if a%i ==0:
print(a,’不是質數’)
break
else :
print(a,’是質數’)
”’本題兩點點評
1 判斷質數的核心算法,數n對2到n-1取模,若發現可以整除,直接跳出循環.循環結束后一直沒有整除,則是質數.
注意最后的else應放在和if同級的位置 而不是if里面
2 數n對2到n-1取模 其實從2到根號n就夠了 因為乘法具有交換律 超過根號n的位置
因為合數一定可以表示成兩個數(除了1和它本身)相乘,這兩個數必然有一個小于等于它的平方根。只要找到小于或等于的那個因數就行了
”’
10萬以內的質數
import datetime
start=datetime.datetime.now()
count=1
for a in range(3,100000,2):#1
if a%10==5 and a>10:#2
continue
for i in range(3,int(a**0.5)+1,2):#3
if a%i ==0:
# print(a,’不是質數’)
break
else :
# print(a,’是質數’)
count+=1
pass
print(count)
end=datetime.datetime.now()
print(end-start)
”’
本題的幾點優化方向
1 求質數 可以先舍去所有偶數 可減少一半的任務量
2 對于大于10的數 若個位數是5, 必然是5的倍數 可直接排除
3 數n對2到n-1取模 其實從2到根號n就夠了 同時待測數中已無偶數,因此取模的數也不需要偶數
”’
python數據類型
數值型
int 長整型 無大小限制
float 雙精度浮點數
complex 虛數單位為j 實部虛部皆為浮點數
bool int的子類 僅有True與False兩個實例 對應1和0 可與整數直接運算
數字處理函數
int() 只取整數
無論正負 只取出整數部分 小數部分直接丟棄(Return an integer object constructed from a number or string x.For floating point numbers, this truncates towards zero)
因此無論是3.1還是3.9,int后皆為3
無論是-3.1還是-3.9,int后皆為-3
import math
math.floor()向下取整 math.ceil向上取整
這兩個函數取整時不考慮誤差 在數軸上,小數兩邊各有一個整數 floor函數取比該數小的整數(Return the floor of x, the largest integer less than or equal to x),ceil函數則取比該數大的整數(Return the ceiling of x, the smallest integer greater than or equal to x.)
floor與ceil的原意為地板與天花板 可形象地表示這一大小邊界
因此無論是3.1還是3.9 floor后皆為3 ceil后皆為4
無論是-3.1還是-3.9 floor后皆為-4 ceil后皆為-3
round() 四舍六入五取偶
無論正負數 以0.5為界 小數部分小于0.5則舍去 大于0.5則整數絕對值進一
等于0.5則取與其最接近的偶數(為減小誤差)
因此2.5 按照取偶數的原則 結果是2
1.5 取偶為2 并非一般的四舍五入
-2.5 取偶為-2
// floor division 地板除
對自然除法得到的小數再做int處理 即對小數向下取整
9//2=4 注意9//-2=-5
power(x,y) == x**y
math.aqrt() 平方根
math.pi 圓周率π
math.e 自然常數
進制函數 bin() oct() hex() 返回值為字符串
type() 返回類型,而不是字符串
列表list ?鏈表linked list 隊列queue ?棧stack
列表 存于連續空間 每個元素有確定的線性增長的地址 表長為n 則索引值為0~n-1 可從中間插入元素 但需向后移位(插入數據較為麻煩) 支持隨機查找
鏈表 不需存于連續空間 由指針指向下一位元素 末位元素指針為空 通過修改指針可方便地插入數據 但不支持隨機查找
隊列 特殊的線性表 只可隊首刪除 隊尾插入 先進先出
棧 有底無蓋的容器 進棧出棧都走棧頂(top) 先進后出
列表list
一列隊伍 列表內個體稱作元素 元素可為任意數據類型(數字 字符串 對象 列表)
元素有序,可用索引 線性結構 用[]表示 可變的
列表的各種操作
初始化: lista=[1,’2′,3.4,5+7j,True] 或 lst = list(range(5))
方法:
尾部追加 append(obj) O(1)
指定索引位置插入 insert(index,obj) O(n)
extend(iteratable) 將可迭代對象的元素追加進來,返回None 就地修改
+ 加號兩邊跟上列表 兩個列表連接起來產生新的列表,原列表不變
lista*n 將列表lista元素重復n次,返回新的列表,原列表不變
remove(value) -> None 從左至右查找第一個匹配value的值,移除該元素,返回None
pop([index]) -> item 不指定索引index,就從列表尾部彈出一個元素 指定索引index,就從索引處彈出一個元素,索引超界拋出IndexError錯誤
clear() -> None 清除列表所有元素,剩下一個空列表
list[index] = value 通過賦值的方式該元素值
reverse() -> None 將列表元素反轉,返回None
sort(key=None, reverse=False) -> None 對列表元素進行排序,就地修改,默認升序 reverse為True,反轉,降序
lista[index] 使用索引可直接訪問 注意索引范圍 0~n-1 ?-1~-n為負索引,表示倒數第一至倒數第n
index(value,[start,[stop]])通過值value,從指定區間([start,[stop]為前閉后開區間)查找列表內的元素是否匹配 匹配第一個就立即返回 索引匹配不到,拋出異常ValueError
count(value) 返回列表中匹配value的次數
len() 返回列表長度

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/92882

(0)
蒙古海軍司令蒙古海軍司令
上一篇 2018-03-25
下一篇 2018-03-25

相關推薦

  • 10月18日作業–hash,history

    1 生產環境發現一臺服務器系統時間產生偏差,造成服務異常,請幫忙校正。 1、使用ntpdate對時間進行同步,然后hwclock -w;并再建立Crontab每小時進行一次時間同步。 2 生產有一個數據同步腳本需要執行很長時間,怎樣做到無人值守,在管理工具退出的情況下,腳本依然能正常運行。 1、載光盤 2、進入/mnt/Packages 安裝共享screen…

    Linux干貨 2016-10-19
  • OSI七層模型

      OSI模型的七層結構 首先,OSI是什么呢?OSI(Open System Interconnection),OSI是一個開放性的通行系統互連參考模型,是一個協議規范。它把網絡協議從邏輯上分為了7層。每一層都有相關、相對應的物理設備。OSI七層模型是一種框架性的設計方法 ,建立七層模型的主要目的是為解決異種網絡互連時所遇到的兼容性問題,其最主要…

    2017-09-02
  • 億級用戶下的新浪微博平臺架構

    序言     新浪微博在2014年3月公布的月活躍用戶(MAU)已經達到1.43億,2014年新年第一分鐘發送的微博達808298條,如此巨大的用戶規模和業務量,需要高可用(HA)、高并發訪問、低延時的強大后臺系統支撐。 微博平臺第一代架構為LAMP架構,數據庫使用的是MyIsam,后臺用的是php,緩存為Memcache。 隨著應用規?!?/p>

    2015-03-16
  • 前兩天課程中學到的東西

    一、計算機組成部分 由CPU,存儲器和輸入輸出系統三大部分組成(或者可以說成四大部分) CPU:相當于大腦,用來執行最重要的任務:計算 存儲器:相當于身體,為CPU提供計算所需要的所有東西 輸入輸出設備:四肢,為整個系統提供需要計算的內容,吧需要給供給CPU的東西放入存儲器中 二、linux發行版,linux發行版主要有三個大類:debian,slackwa…

    Linux干貨 2016-10-30
  • 馬哥教育網絡班21期+第一周課程練習

    1、描述計算機的組成及其功能。 計算機由五大組件組成包括:計算器,控制器,存儲,輸入設備,輸出設備。 運算器:做運算,且只能做二進制運算,包括算術運算和邏輯運算,如加減乘除,移位,取模。運算器的核心是加法器。 控制器:控制整個計算機部件之間協調。比如做計算,運算器先從存儲器取數,運算器作運算,再回存存儲器。這整個過程都由控制器做協調。  &nbsp…

    Linux干貨 2016-07-12
  • 簡單的bash腳本查看任意網段的在線主機

    一前言         最近看到許多同志在寫ping某個地址段的bash腳本,我也心血來潮來了一發。  當然本人新手,大神勿噴。 二準備工作           linux系統的機…

    2017-03-02
欧美性久久久久