A. python中什麼是位置參數
先說說函數定義,我們都知道,下面的代碼定義了一個函數funcA
def funcA():
pass
顯然,函數funcA沒有參數(同時啥也不幹:D)。
下面這個函數funcB就有兩個參數了,
def funcB(a, b):
print a
print b
調用的時候,我們需要使用函數名,加上圓括弧擴起來的參數列表,比如 funcB(100, 99),執行結果是:
100
99
很明顯,參數的順序和個數要和函數定義中一致,如果執行funcB(100),Python會報錯的:
TypeError: funcB() takes exactly 2 arguments (1 given)
我們可以在函數定義中使用參數默認值,比如
def funcC(a, b=0):
print a
print b
在函數funcC的定義中,參數b有默認值,是一個可選參數,如果我們調用funcC(100),b會自動賦值為0。
OK,目前為止,我們要定義一個函數的時候,必須要預先定義這個函數需要多少個參數(或者說可以接受多少個參數)。一般情況下這是沒問題的,但是也有在定義函數的時候,不能知道參數個數的情況(想一想C語言里的printf函數),在Python里,帶*的參數就是用來接受可變數量參數的。看一個例子
def funcD(a, b, *c):
print a
print b
print "length of c is: %d " % len(c)
print c
調用funcD(1, 2, 3, 4, 5, 6)結果是
1
2
length of c is: 4
(3, 4, 5, 6)
我們看到,前面兩個參數被a、b接受了,剩下的4個參數,全部被c接受了,c在這里是一個tuple。我們在調用funcD的時候,至少要傳遞2個參數,2個以上的參數,都放到c里了,如果只有兩個參數,那麼c就是一個empty tuple。
好了,一顆星我們弄清楚了,下面輪到兩顆星。
上面的例子里,調用函數的時候,傳遞的參數都是根據位置來跟函數定義里的參數表匹配的,比如funcB(100, 99)和funcB(99, 100)的執行結果是不一樣的。在Python里,還支持一種用關鍵字參數(keyword argument)調用函數的辦法,也就是在調用函數的時候,明確指定參數值付給那個形參。比如還是上面的funcB(a, b),我們通過這兩種方式調用
funcB(a=100, b=99)
和
funcB(b=99, a=100)
結果跟funcB(100, 99)都是一樣的,因為我們在使用關鍵字參數調用的時候,指定了把100賦值給a,99賦值給b。也就是說,關鍵字參數可以讓我們在調用函數的時候打亂參數傳遞的順序!
另外,在函數調用中,可以混合使用基於位置匹配的參數和關鍵字參數,前題是先給出固定位置的參數,比如
def funcE(a, b, c):
print a
print b
print c
調用funcE(100, 99, 98)和調用funcE(100, c=98, b=99)的結果是一樣的。
好了,經過以上鋪墊,兩顆星總算可以出場了:
如果一個函數定義中的最後一個形參有 ** (雙星號)前綴,所有正常形參之外的其他的關鍵字參數都將被放置在一個字典中傳遞給函數,比如:
def funcF(a, **b):
print a
for x in b:
print x + ": " + str(b[x])
調用funcF(100, c='你好', b=200),執行結果
100
c: 你好
b: 200
大家可以看到,b是一個dict對象實例,它接受了關鍵字參數b和c。
B. 如何使用python遠程登錄一個操作系統,並執行某條命令
你可以使用python的pexcpct包通過ssh調用遠程伺服器指令:
import pxssh
import getpass
try:
s = pxssh.pxssh()
hostname = raw_input('hostname: ')
username = raw_input('username: ')
password = getpass.getpass('password: ')
s.login (hostname, username, password)
s.sendline ('uptime') # run a command
s.prompt() # match the prompt
print s.before # print everything before the propt.
s.sendline ('ls -l')
s.prompt()
print s.before
s.sendline ('df')
s.prompt()
print s.before
s.logout()
except pxssh.ExceptionPxssh, e:
print "pxssh failed on login."
print str(e)
C. pexpct 在python 3里的錯誤,
你先搜下源碼中的shizi這個單詞,看看都出現在哪裡,是否要用global前綴標識它是全局變數
D. 如何使用 Python 創建一個 NBA 得分圖
首先,我們需要獲得每個球員的投籃數據。利用 Savvas Tjortjoglou 貼出的代碼,筆者從 NBA.com 網站 API 上獲取了數據。在此不會貼出這個函數的結果。如果你感興趣,推薦你去看看 Savvas Tjortjoglou 的博客。
def aqcuire_shootingData(PlayerID,Season):
import requests
shot_chart_url = 'http://stats.nba.com/stats/shotchartdetail?CFID=33&CFPARAMS='+Season+'&ContextFilter='\
'&ContextMeasure=FGA&DateFrom=&DateTo=&GameID=&GameSegment=&LastNGames=0&LeagueID='\
'00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PaceAdjust='\
'N&PerMode=PerGame&Period=0&PlayerID='+PlayerID+'&PlusMinus=N&Position=&Rank='\
'N&RookieYear=&Season='+Season+'&SeasonSegment=&SeasonType=Regular+Season&TeamID='\
'0&VsConference=&VsDivision=&mode=Advanced&showDetails=0&showShots=1&showZones=0'
response = requests.get(shot_chart_url)
headers = response.json()['resultSets'][0]['headers']
shots = response.json()['resultSets'][0]['rowSet']
shot_df = pd.DataFrame(shots, columns=headers)
return shot_df
接下來,我們需要繪制一個包含得分圖的籃球場圖。該籃球場圖例必須使用與NBA.com API 相同的坐標系統。例如,3分位置的投籃距籃筐必須為 X 單位,上籃距離籃筐則是 Y 單位。同樣,筆者再次使用了 Savvas Tjortjoglou 的代碼(哈哈,否則的話,搞明白 NBA.com 網站的坐標系統肯定會耗費不少的時間)。
def draw_court(ax=None, color='black', lw=2, outer_lines=False):
from matplotlib.patches import Circle, Rectangle, Arc
if ax is None:
ax = plt.gca()
hoop = Circle((0, 0), radius=7.5, linewidth=lw, color=color, fill=False)
backboard = Rectangle((-30, -7.5), 60, -1, linewidth=lw, color=color)
outer_box = Rectangle((-80, -47.5), 160, 190, linewidth=lw, color=color,
fill=False)
inner_box = Rectangle((-60, -47.5), 120, 190, linewidth=lw, color=color,
fill=False)
top_free_throw = Arc((0, 142.5), 120, 120, theta1=0, theta2=180,
linewidth=lw, color=color, fill=False)
bottom_free_throw = Arc((0, 142.5), 120, 120, theta1=180, theta2=0,
linewidth=lw, color=color, linestyle='dashed')
restricted = Arc((0, 0), 80, 80, theta1=0, theta2=180, linewidth=lw,
color=color)
corner_three_a = Rectangle((-220, -47.5), 0, 140, linewidth=lw,
color=color)
corner_three_b = Rectangle((220, -47.5), 0, 140, linewidth=lw, color=color)
three_arc = Arc((0, 0), 475, 475, theta1=22, theta2=158, linewidth=lw,
color=color)
center_outer_arc = Arc((0, 422.5), 120, 120, theta1=180, theta2=0,
linewidth=lw, color=color)
center_inner_arc = Arc((0, 422.5), 40, 40, theta1=180, theta2=0,
linewidth=lw, color=color)
court_elements = [hoop, backboard, outer_box, inner_box, top_free_throw,
bottom_free_throw, restricted, corner_three_a,
corner_three_b, three_arc, center_outer_arc,
center_inner_arc]
if outer_lines:
outer_lines = Rectangle((-250, -47.5), 500, 470, linewidth=lw,
color=color, fill=False)
court_elements.append(outer_lines)
for element in court_elements:
ax.add_patch(element)
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.set_xticks([])
ax.set_yticks([])
return ax
我想創造一個不同位置的投籃百分比數組,因此決定利用 matplot 的 Hexbin 函數 http://matplotlib.org/api/pyplot_api.html 將投籃位置均勻地分組到六邊形中。該函數會對每個六邊形中每一個位置的投籃次數進行計數。
六邊形是均勻的分布在 XY 網格中。「gridsize」變數控制六邊形的數目。「extent」變數控制第一個和最後一個六邊形的繪制位置(一般來說第一個六邊形的位置基於第一個投籃的位置)。
計算命中率則需要對每個六邊形中投籃的次數和投籃得分次數進行計數,因此筆者對同一位置的投籃和得分數分別運行 hexbin 函數。然後,只需用每個位置的進球數除以投籃數。
def find_shootingPcts(shot_df, gridNum):
x = shot_df.LOC_X[shot_df['LOC_Y']<425.1] #i want to make sure to only include shots I can draw
y = shot_df.LOC_Y[shot_df['LOC_Y']<425.1]
x_made = shot_df.LOC_X[(shot_df['SHOT_MADE_FLAG']==1) & (shot_df['LOC_Y']<425.1)]
y_made = shot_df.LOC_Y[(shot_df['SHOT_MADE_FLAG']==1) & (shot_df['LOC_Y']<425.1)]
#compute number of shots made and taken from each hexbin location
hb_shot = plt.hexbin(x, y, gridsize=gridNum, extent=(-250,250,425,-50));
plt.close() #don't want to show this figure!
hb_made = plt.hexbin(x_made, y_made, gridsize=gridNum, extent=(-250,250,425,-50),cmap=plt.cm.Reds);
plt.close()
#compute shooting percentage
ShootingPctLocs = hb_made.get_array() / hb_shot.get_array()
ShootingPctLocs[np.isnan(ShootingPctLocs)] = 0 #makes 0/0s=0
return (ShootingPctLocs, hb_shot)
筆者非常喜歡 Savvas Tjortjoglou 在他的得分圖中加入了球員頭像的做法,因此也順道用了他的這部分代碼。球員照片會出現在得分圖的右下角。
def acquire_playerPic(PlayerID, zoom, offset=(250,400)):
from matplotlib import offsetbox as osb
import urllib
pic = urllib.urlretrieve("http://stats.nba.com/media/players/230x185/"+PlayerID+".png",PlayerID+".png")
player_pic = plt.imread(pic[0])
img = osb.OffsetImage(player_pic, zoom)
#img.set_offset(offset)
img = osb.AnnotationBbox(img, offset,xycoords='data',pad=0.0, box_alignment=(1,0), frameon=False)
return img
筆者想用連續的顏色圖來描述投籃進球百分比,紅圈越多代表著更高的進球百分比。雖然「紅」顏色圖示效果不錯,但是它會將0%的投籃進球百分比顯示為白色http://matplotlib.org/users/colormaps.html,而這樣顯示就會不明顯,所以筆者用淡粉紅色代表0%的命中率,因此對紅顏色圖做了下面的修改。
#cmap = plt.cm.Reds
#cdict = cmap._segmentdata
cdict = {
'blue': [(0.0, 0.6313725709915161, 0.6313725709915161), (0.25, 0.4470588266849518, 0.4470588266849518), (0.5, 0.29019609093666077, 0.29019609093666077), (0.75, 0.11372549086809158, 0.11372549086809158), (1.0, 0.05098039284348488, 0.05098039284348488)],
'green': [(0.0, 0.7333333492279053, 0.7333333492279053), (0.25, 0.572549045085907, 0.572549045085907), (0.5, 0.4156862795352936, 0.4156862795352936), (0.75, 0.0941176488995552, 0.0941176488995552), (1.0, 0.0, 0.0)],
'red': [(0.0, 0.9882352948188782, 0.9882352948188782), (0.25, 0.9882352948188782, 0.9882352948188782), (0.5, 0.9843137264251709, 0.9843137264251709), (0.75, 0.7960784435272217, 0.7960784435272217), (1.0, 0.40392157435417175, 0.40392157435417175)]
}
mymap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)
好了,現在需要做的就是將它們合並到一塊兒。下面所示的較大函數會利用上文描述的函數來創建一個描述投籃命中率的得分圖,百分比由紅圈表示(紅色越深 = 更高的命中率),投籃次數則由圓圈的大小決定(圓圈越大 = 投籃次數越多)。需要注意的是,圓圈在交疊之前都能增大。一旦圓圈開始交疊,就無法繼續增大。
在這個函數中,計算了每個位置的投籃進球百分比和投籃次數。然後畫出在該位置投籃的次數(圓圈大小)和進球百分比(圓圈顏色深淺)。
def shooting_plot(shot_df, plot_size=(12,8),gridNum=30):
from matplotlib.patches import Circle
x = shot_df.LOC_X[shot_df['LOC_Y']<425.1]
y = shot_df.LOC_Y[shot_df['LOC_Y']<425.1]
#compute shooting percentage and # of shots
(ShootingPctLocs, shotNumber) = find_shootingPcts(shot_df, gridNum)
#draw figure and court
fig = plt.figure(figsize=plot_size)#(12,7)
cmap = mymap #my modified colormap
ax = plt.axes([0.1, 0.1, 0.8, 0.8]) #where to place the plot within the figure
draw_court(outer_lines=False)
plt.xlim(-250,250)
plt.ylim(400, -25)
#draw player image
zoom = np.float(plot_size[0])/(12.0*2) #how much to zoom the player's pic. I have this hackily dependent on figure size
img = acquire_playerPic(PlayerID, zoom)
ax.add_artist(img)
#draw circles
for i, shots in enumerate(ShootingPctLocs):
restricted = Circle(shotNumber.get_offsets()[i], radius=shotNumber.get_array()[i],
color=cmap(shots),alpha=0.8, fill=True)
if restricted.radius > 240/gridNum: restricted.radius=240/gridNum
ax.add_patch(restricted)
#draw color bar
ax2 = fig.add_axes([0.92, 0.1, 0.02, 0.8])
cb = mpl.colorbar.ColorbarBase(ax2,cmap=cmap, orientation='vertical')
cb.set_label('Shooting %')
cb.set_ticks([0.0, 0.25, 0.5, 0.75, 1.0])
cb.set_ticklabels(['0%','25%', '50%','75%', '100%'])
plt.show()
return ax
好了,大功告成!因為筆者是森林狼隊的粉絲,在下面用幾分鍾跑出了森林狼隊前六甲的得分圖。
PlayerID = '203952' #andrew wiggins
shot_df = aqcuire_shootingData(PlayerID,'2015-16')
ax = shooting_plot(shot_df, plot_size=(12,8));
E. python中時間序列數據的一些處理方式
datetime.timedelta對象代表兩個時間之間的時間差,兩個date或datetime對象相減就可以返回一個timedelta對象。
利用以下數據進行說明:
如果我們發現時間相關內容的變數為int,float,str等類型,不方便後面的分析,就需要使用該函數轉化為常用的時間變數格式:pandas.to_datetime
轉換得到的時間單位如下:
如果時間序列格式不統一,pd.to_datetime()的處理方式:
當然,正確的轉換是這樣的:
第一步:to_datetime()
第二步:astype(datetime64[D]),astype(datetime64[M])
本例中:
order_dt_diff必須是Timedelta(Ɔ days 00:00:00')格式,可能是序列使用了diff()
或者pct_change()。
前者往往要通過'/np.timedelta'去掉單位days。後者其實沒有單位。
假如我們要統計某共享單車一天內不同時間點的用戶使用數據,例如
還有其他維度的提取,年、月、日、周,參見:
Datetime properties
注意 :.dt的對象必須為pandas.Series,而不可以是Series中的單個元素
F. 怎麼用python計算股票
作為一個python新手,在學習中遇到很多問題,要善於運用各種方法。今天,在學習中,碰到了如何通過收盤價計算股票的漲跌幅。
第一種:
讀取數據並建立函數:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import spline
from pylab import *
import pandas as pd
from pandas import Series
a=pd.read_csv('d:///1.csv',sep=',')#文件位置
t=a['close']
def f(t):
s=[]
for i in range(1,len(t)):
if i==1:
continue
else:
s.append((t[i]-t[i-1])/t[i]*100)
print s
plot(s)
plt.show()
f(t)
第二種:
利用pandas裡面的方法:
import pandas as pd
a=pd.read_csv('d:///1.csv')
rets = a['close'].pct_change() * 100
print rets
第三種:
close=a['close']
rets=close/close.shift(1)-1
print rets
總結:python是一種非常好的編程語言,一般而言,我們可以運用構建相關函數來實現自己的思想,但是,眾所周知,python中裡面的有很多科學計算包,裡面有很多方法可以快速解決計算的需要,如上面提到的pandas中的pct_change()。因此在平時的使用中應當學會尋找更好的方法,提高運算速度。
G. python列表裡面嵌套字典怎麼取下標
1、打開python,新建一個python項目。
2、python項目創建好後,在項目中定義一個list列表,並初始化,list=[1,4,5,7,8]。
3、list列表定義好後,使用enumerate函數即可獲取指定列表元素的下標。
H. python怎麼用變數重復執行
在python之中如果想要去重復執行一段代碼的話就只需要用while或者是for語句去創建出一個循環結構就可以了,但是python程序是一個完整的python文件,要重復執行它的話就要用到特殊的方法了。下文對此會有詳細的代碼示例和解析,一起往下看看吧。
python程序就是一個py類型的文件,它只有在命令行之中可以御跡去直接執行,但是在python交互環境之中是無法去執行。要重復執行一個python程序的話就得用到一個叫做os的模塊了。
1.創建一個python文件並它和要重復執行的python程序放在同一個文件夾之中,然後打開python編輯器來編寫這個python文件的代碼。在文件的頂部寫上導入os模塊的代碼,然後創建一個無限的while循環。
2.在循環結構之中使用變數去保存幾個字元串,字元串的內容就是python xxx.py。在循環的末尾使用os模塊的system()並將一個納拆禪字元串變數給傳進去,示例如下:
while True: run_ticker = 'python ticker.py' run_depth = 'python depth.py' run_depth_pct = 'python depth_pct.py' run_trade = 'python trade.py' os.system(run_depth_pct)
代碼編寫完成之後保存這個python文件,雙擊啟動它即可重復執行system()方法內的python程序了。
這個python腳本實現的關鍵就在於用變數來保存執行python程序的命令,然後用system()方法去執行這個命令,因為system()實際上就是在命令行之中去執行括弧內的命令。又因為這些代碼在while無限循環之中,啟動之後python程序就重復運行了。
以上就是關於「Python怎麼讓程序重復運行?Python重復運行程序方法詳解」的全部內容了,想要了解更多python的洞塵實用知識和代碼示例可以持續關注這個頻道,每次更新都會有很多新的知識技術分享給大家。
I. python的內置函數有哪些,都是什麼意思
print-輸出,input-輸入,int-將字元串轉數字(字元串必須是數字),str-將數字轉為字元串,list-將字元串/數字轉為列表,for-有限循環,while-無限循環……………………………………