本人之前写过若干“给程序员加财商”的系列文,目的是通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得。

在之前的系列文里,大家能看到K线,均线,成交量的案例,在本文里,大家能看到通过RSI案例讲述Python邮件编程的知识点,在后继系列文里,大家还能看到MACD,BIAS,KDJ等指标相关案例。

1  RSI指标的原理和算法描述

相对强弱指标(RSI)是通过比较某个时段内单股价格的涨跌幅度来判断多空双方的强弱程度,以此来预测未来走势。从数值上看,它体现出某股的买卖力量,所以投资者能据此预测未来价格的走势,在实践中,通常与移动平均线配合使用,以提高分析的准确性。

RSI指标的计算公式如下所示。

第一步,RS(相对强度)=N日内收盘价涨数和的均值÷N日内收盘价跌数和的均值

第二步,RSI(相对强弱指标)=100-100÷(1+RS)

请注意,这里“均值“的计算方法可以是简单移动平均(SMA),也可以是加权移动平均(WMA)指数移动平均(EMA)。本书采用的是比较简单的简单移动平均算法,有些软件采用的是后两种平均算法。采用不同的平均算法会导致RSI的值不同,但趋势不会改变,对交易的指导意义也不会变。

以6日RSI指标为例,从当日算起向前推算6个交易日,获取到包括本日在内的7个收盘价,用每一日的收盘价减去上一交易日的收盘价,以此方式得到6个数值,这些数值中有正有负。随后再按如下四个步骤计算RSI指标。

第一步,up=6个数字中正数之和的平均值。

第二步,down=先取6个数字中负数之和的绝对值,再对绝对值取平均值。

第三步,RS=up除以down,RS表示相对强度

第四步,RSI(相对强弱指标)=100-100÷(1+RS)

如果再对第四步得出的结果进行数学变换,能进一步约去RS因素,得到如下的结论:RSI=100x(up) ÷(up+down),也就是说,RSI等于100乘以up除以(up和down的和)。

从本质上来看,RSI反映了某阶段内(比如6个交易日内)由价格上涨引发的波动占总波动的百分比率,百分比越大,说明这个时间段内股票越强势,反之如果百分比越小,则说明股票弱势程度强。

从上述公式中我们能看到,RSI的值介于0到100之间,目前比较常见的基准周期为6日\12日和24日。把每个交易日的RSI值在坐标图上的点连成曲线,即能绘制成RSI指标线,也就是说,目前沪深股市中RSI指标线是由三根曲线构成,如下图所示。

2  把用Matplotlib绘制的RSI指标图存为图片

在如下的DrawRSI.py案例中,我们将根据上述算法绘制600584(长电科技)从2018年9月到2019年5月间的的6日、12日和24日的RSI指标。

本例的数据来自csv文件,而该文件的数据来自网络股票接口,相关内容大家可以阅读之前博文。在本案例中,还会把由matplotlib生成的图形存为png格式,以方便之后用邮件的形式发送。

  1. 1 #!/usr/bin/env python
  2. 2 #coding=utf-8
  3. 3 import pandas as pd
  4. 4 import matplotlib.pyplot as plt
  5. 5 #计算RSI的方法,入参periodList传入周期列表
  6. 6 def calRSI(df,periodList):
  7. 7 #计算和上一个交易日收盘价的差值
  8. 8 df['diff'] = df["Close"]-df["Close"].shift(1)
  9. 9 df['diff'].fillna(0, inplace = True)
  10. 10 df['up'] = df['diff']
  11. 11 #过滤掉小于0的值
  12. 12 df['up'][df['up']] = 0
  13. 13 df['down'] = df['diff']
  14. 14 #过滤掉大于0的值
  15. 15 df['down'][df['down']] = 0
  16. 16 #通过for循环,依次计算periodList中不同周期的RSI等值
  17. 17 for period in periodList:
  18. 18 df['upAvg'+str(period)] = df['up'].rolling(period).sum()/period
  19. 19 df['upAvg'+str(period)].fillna(0, inplace = True)
  20. 20 df['downAvg'+str(period)] = abs(df['down'].rolling(period).sum()/period)
  21. 21 df['downAvg'+str(period)].fillna(0, inplace = True)
  22. 22 df['RSI'+str(period)] = 100 - 100/((df['upAvg'+str(period)]/df['downAvg'+str(period)]+1))
  23. 23 return df

在第5行里,我们定义了用于计算RSI值的calRSI方法,该方法第一个参数是包含日期收盘价等信息的dataframe类型的df对象,第二个参数是周期列表。

在第8行里,我们把本交易日和上个交易日收盘价的差价存入了'diff'列,这里是用shift(1)来获取df里上一行(即上个交易日)的收盘价。由于第一行的diff值是NaN,所以需要用第9行的fillna方法把NaN值更新成0。

在第11行里,在df对象里创建了up列,该列的值暂时和diff值相同,有正有负,但马上就通过第12行的df['up'][df['up']<0] = 0代码,把up列中的负值设置成0,这样一来,up列里就只包含了“N日内收盘价的涨数”。在第13行和第15行里,用同样的方法,在df对象中创建了down列,并在其中存入了“N日内收盘价的跌数”。

随后是通过第17行的for循环,遍历存储在periodList中的周期对象,其实通过下面第26行的代码,我们能看到计算RSI的周期分别是6天、12天和24天。针对每个周期,先是在第18行,算出了这个周期内收盘价涨数和的均值,并把这个均值存入df对象中的'upAvg'+str(period)列中,比如当前周期是6,那么该涨数的均值是存入df[‘upAvg6‘]列。在第20行,则算出该周期内的收盘价跌数的均值,并存入'downAvg'+str(period)列中。最后在第22行,算出本周期内的RSI值,并放入df对象中的'RSI'+str(period)里。

  1. 24 filename='D:\\stockData\ch10\\6005842018-09-012019-05-31.csv'
  2. 25 df = pd.read_csv(filename,encoding='gbk')
  3. 26 list = [6,12,24] #周期列表
  4. 27 #调用方法计算RSI
  5. 28 stockDataFrame = calRSI(df,list)
  6. 29 #print(stockDataFrame)
  7. 30 #开始绘图
  8. 31 plt.figure()
  9. 32 stockDataFrame['RSI6'].plot(color="blue",label='RSI6')
  10. 33 stockDataFrame['RSI12'].plot(color="green",label='RSI12')
  11. 34 stockDataFrame['RSI24'].plot(color="purple",label='RSI24')
  12. 35 plt.legend(loc='best') #绘制图例
  13. 36 #设置x轴坐标标签和旋转角度
  14. 37 major_index=stockDataFrame.index[stockDataFrame.index==0]
  15. 38 major_xtics=stockDataFrame['Date'][stockDataFrame.index==0]
  16. 39 plt.xticks(major_index,major_xtics)
  17. 40 plt.setp(plt.gca().get_xticklabels(), rotation=30)
  18. 41 #带网格线,且设置了网格样式
  19. 42 plt.grid(linestyle='-.')
  20. 43 plt.title("RSI效果图")
  21. 44 plt.rcParams['font.sans-serif']=['SimHei']
  22. 45 plt.savefig('D:\\stockData\ch10\\6005842018-09-012019-05-31.png')
  23. 46 plt.show()

在第25行里,我们从指定csv文件里得到了包含日期收盘价等信息的数据,并在第26行指定了三个计算周期。在第28行里,我们调用了calRSI方法计算了三个周期的RSI值,并存入stockDataFrame对象,当前第29行的输出语句是注释掉的,在打开后,大家能看到计算后的结果值,其中包含upAvg6、downAvg6和RSI6等列。

在得到RSI数据后,从第31行开始绘图,其中比较重要的步骤是通过第32行到第34行的代码,用plot方法绘制三根曲线,随后通过第35行的legend方法设置图例,通过第37行和第38行的代码设置x轴刻度的文字以及旋转效果,通过第42行的代码设置网格样式,通过第43的代码设置标题。

在第46行通过show方法绘图前,我们通过第45行的代码,用savefig方法把图形保存到了指定目录,请注意这句话需要放在show方法前,否则保存的图片就会是空的。

运行上述代码,能看到如下图所示的RSI效果图。需要说明的是,由于本例在计算收盘价涨数和均值和收盘价跌数和均值时,用的是简单移动平均算法,所以绘制出来的图形可能和一些软件里的不一致,但趋势相同。而且,在指定目录里,能看到png图片。

3  整合K线后用邮件发送

在DrawKwithRSI.py代码里,我们将完成如下三个工作,第一,计算6日、12日和24日的RSI值。第二,绘制K线加均线加RSI指标图,并把结果保存为png格式图片。第三,发送邮件,并把png图片以富文本的格式展示在邮件正文中。

  1. 1 #!/usr/bin/env python
  2. 2 #coding=utf-8
  3. 3 import pandas as pd
  4. 4 import matplotlib.pyplot as plt
  5. 5 from mpl_finance import candlestick2_ochl
  6. 6 from matplotlib.ticker import MultipleLocator
  7. 7 import smtplib
  8. 8 from email.mime.text import MIMEText
  9. 9 from email.mime.image import MIMEImage
  10. 10 from email.mime.multipart import MIMEMultipart
  11. 11 #计算RSI的方法,入参periodList传入周期列表
  12. 12 def calRSI(df,periodList):
  13. 13 DrawRSI.py案例中的一致    

从第3行到第10行,我们引入了相关的库文件,第12行定义的calRSI方法和之前案例中的完全一致,所以就不再给出代码。

  1. 14 filename='D:\\stockData\ch10\\6005842018-09-012019-05-31.csv'
  2. 15 df = pd.read_csv(filename,encoding='gbk')
  3. 16 list = [6,12,24] #周期列表
  4. 17 #调用方法计算RSI
  5. 18 stockDataFrame = calRSI(df,list)
  6. 19 figure = plt.figure()
  7. 20 #创建子图
  8. 21 (axPrice, axRSI) = figure.subplots(2, sharex=True)
  9. 22 #调用方法,在第axPrice子图里绘制K线图
  10. 23 candlestick2_ochl(ax = axPrice, opens=df["Open"].values, closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green')
  11. 24 axPrice.set_title("K线图和均线图")#设置子图标题
  12. 25 stockDataFrame['Close'].rolling(window=3).mean().plot(ax=axPrice,color="red",label='3天均线')
  13. 26 stockDataFrame['Close'].rolling(window=5).mean().plot(ax=axPrice,color="blue",label='5天均线')
  14. 27 stockDataFrame['Close'].rolling(window=10).mean().plot(ax=axPrice,color="green",label='10天均线')
  15. 28 axPrice.legend(loc='best') #绘制图例
  16. 29 axPrice.set_ylabel("价格(单位:元)")
  17. 30 axPrice.grid(linestyle='-.') #带网格线
  18. 31 #在axRSI子图里绘制RSI图形
  19. 32 stockDataFrame['RSI6'].plot(ax=axRSI,color="blue",label='RSI6')
  20. 33 stockDataFrame['RSI12'].plot(ax=axRSI,color="green",label='RSI12')
  21. 34 stockDataFrame['RSI24'].plot(ax=axRSI,color="purple",label='RSI24')
  22. 35 plt.legend(loc='best') #绘制图例
  23. 36 plt.rcParams['font.sans-serif']=['SimHei']
  24. 37 axRSI.set_title("RSI图")#设置子图的标题
  25. 38 axRSI.grid(linestyle='-.') #带网格线
  26. 39 #设置x轴坐标标签和旋转角度
  27. 40 major_index=stockDataFrame.index[stockDataFrame.index%7==0]
  28. 41 major_xtics=stockDataFrame['Date'][stockDataFrame.index%7==0]
  29. 42 plt.xticks(major_index,major_xtics)
  30. 43 plt.setp(plt.gca().get_xticklabels(), rotation=30)
  31. 44 plt.savefig('D:\\stockData\ch10\\600584RSI.png')

在第18行里,我们通过调用calRSI方法得到了三个周期的RSI数据。在第21行里,设置了axPrice和axRSI这两个子图共享x轴标签,在第23行里绘制了K线图,在第25行到第27行里,绘制了3日、5日和10日的均线,在第32行到第34行里,绘制了6日、12日和24日的三根RSI指标图。在第44行里通过savefig方法,把包含K线、均线和RSI指标线的图形存在指定目录中。

  1. 45 #发送邮件
  2. 46 def sendMail(username,pwd,from_addr,to_addr,msg):
  3. 47 和之前sendMailWithPicAttachment.py案例中的一致
  4. 48 def buildMail(HTMLContent,subject,showFrom,showTo,attachfolder,attachFileName):
  5. 49 message = MIMEMultipart()
  6. 50 body = MIMEText(HTMLContent, 'html', 'utf-8')
  7. 51 message.attach(body)
  8. 52 message['Subject'] = subject
  9. 53 message['From'] = showFrom
  10. 54 message['To'] = showTo
  11. 55 imageFile = MIMEImage(open(attachfolder+attachFileName, 'rb').read())
  12. 56 imageFile.add_header('Content-ID', attachFileName)
  13. 57 imageFile['Content-Disposition'] = 'attachment;filename="'+attachFileName+'"'
  14. 58 message.attach(imageFile)
  15. 59 return message

 第46行定义的sendMail方法和之前案例中的完全一致,所以就不给出详细的代码。本案例与之前不同的是,在第48行里,专门定义了buildMail方法,用来组装邮件对象,邮件的诸多要素由该方法的参数所定义。

具体而言,在第49行里定义邮件类型是MIMEMultipart,也就是说带附件的邮件,在第50行和第51行里,根据参数HTMLContent构建了邮件的正文,在第52行到第54行里,设置了邮件的相关属性值,从第55行到第57行,根据入参构建了MIMEImage类型的图片类附件,在第58行里,通过attach方法把附件并入邮件正文。

  1. 60 subject='RSI效果图'
  2. 61 attachfolder='D:\\stockData\\ch10\\'
  3. 62 attachFileName='600584RSI.png'
  4. 63 HTMLContent = '<html><head></head><body>'\
  5. 64 '<img src="cid:'+attachFileName+'"/>'\
  6. 65 '</body></html>'
  7. 66 message = buildMail(HTMLContent,subject,'hsm_computer@163.com','hsm_computer@163.com',attachfolder,attachFileName)
  8. 67 sendMail('hsm_computer','xxx','hsm_computer@163.com','hsm_computer@163.com',message.as_string())
  9. 68 #最后再绘制
  10. 69 plt.show()

 在第60行到第66行,我们设置了邮件的相关属性值,并在第66行里,通过调用buildMail方法创建了邮件对象message,在第第67行里,通过调用sendMail方法发送邮件,最后在第69行通过show方法绘制了图形。请大家注意本案例中的三个细节。

第一,           第64行cid的值需要和第56行的Content-ID值一致,否则图片只能以附件的形式发送,无法在邮件正文里以富文本的格式展示。

第二,           我们是先构建和发送邮件,再通过第69行的代码绘制图形,如果次序颠倒先绘制图形后发送邮件的话,show方法被调用后程序会阻塞在这个位置,代码无法继续执行。要等到手动关闭掉由show方法弹出的窗口后,才会触发sendMail方法发送邮件。

第三,           在本案例的第48行,我们专门封装了用于构建邮件对象的buildMail方法,在其中通过参数动态地构建邮件,这样如果要发送其它邮件,则可以调用该方法,从而能提升代码的重用性。

运行上述代码,我们能在弹出的窗口里看到K线、均线和RSI指标图整合后的效果图,而且能在邮件的正文里看到相同的图。

4  RSI指标对买卖点的指导意义

一般来说,我们把6日、12日和24日的RSI指标称为为短期、中期和长期指标。和KDJ指标一样,RSI指标也有超买和超卖区。

具体而言,当RSI值在50到70间波动时,表示当前属于强势状态,如继续上升,超过80时,则到超买区,极可能在短期内转升为跌。反之RSI值在20到50之间时,说明当前市场处于相对弱势,如下降到20以下,则进入超卖区,股价可能出现反弹。

在讲述RSI交易策略前,我们先来讲述下在实际操作中总结出来的RSI指标的缺陷。

第一,周期较短(比如6日)的RSI指标比较灵敏,但快速震荡的次数较多,可靠性相对差些,而周期较长(比如24日)的RSI指标可靠性强,但灵敏度不够,经常会“滞后”的情况。

第二,当数值在40到60间波动时,往往参考价值不大,具体而言,当数值向上突破50临界点时,表示股价已转强,反之向下跌破50时则表示转弱,不过在实践过程中,经常会出现RSI跌破50后股价却不下跌,而突破50后股价不涨。

综合RSI算法、相关理论以及缺陷,我们来讲述下实际操作中常用的基于该指标的卖策略。

第一,RSI短期指标(6日)在20以下超卖区与中长期RSI(12日或24日)发生黄金交叉,即6日线上穿12日或24日线,则说明即将发生反弹行情,如果其它技术或政策等方面没太大问题,可以适当买进。

第二,反之,RSI短期指标(6日)在80以上超买区与中长期RSI(12日或24日)发生死亡交叉,即6日线下穿12日或24日线,则说明可能会出现高位反转的情况,如果没有其它利好消息,可以考虑卖出。

5 计算卖点,以邮件的形式发送

根据上文描述,这里采用的基于RSI的买点策略是,RSI6日线在20以下与中长期RSI(12日或24日)发生黄金交叉。在如下的calRSIBuyPoints.py案例中,我们据此策略计算600584(长电科技)从2018年9月到2019年5月间的卖点,而且通过邮件发送买点日期。

  1. 1 #!/usr/bin/env python
  2. 2 #coding=utf-8
  3. 3 import pandas as pd
  4. 4 import smtplib
  5. 5 from email.mime.text import MIMEText
  6. 6 from email.mime.image import MIMEImage
  7. 7 from email.mime.multipart import MIMEMultipart
  8. 8 #计算RSI的方法,入参periodList传入周期列表
  9. 9 def calRSI(df,periodList):
  10. 10 DrawRSI.py案例中的一致,省略相关代码
  11. 11 filename='D:\\stockData\ch10\\6005842018-09-012019-05-31.csv'
  12. 12 df = pd.read_csv(filename,encoding='gbk')
  13. 13 list = [6,12,24] #周期列表
  14. 14 #调用方法计算RSI
  15. 15 stockDataFrame = calRSI(df,list)

在上述代码的第15行里,我们通过调用calRSI方法计算RSI指标值,这部分和10.3.2部分的calRSIBuyPoints.py相关代码非常相似,所以就不再重复说明。

  1. 16 cnt=0
  2. 17 sellDate=''
  3. 18 while cnt<=len(stockDataFrame)-1:
  4. 19 if(cnt>=30):#前几天有误差,从第30天算起
  5. 20 try:
  6. 21 #规则1,这天RSI6高于80
  7. 22 if stockDataFrame.iloc[cnt]['RSI6']<80:
  8. 23 #规则2.1,当天RSI6下穿RSI12
  9. 24 if stockDataFrame.iloc[cnt]['RSI6']<stockDataFrame.iloc[cnt]['RSI12'] and stockDataFrame.iloc [cnt-1]['RSI6']>stockDataFrame.iloc[cnt-1]['RSI12']:
  10. 25 sellDate = sellDate+stockDataFrame.iloc[cnt]['Date'] + ','
  11. 26 #规则2.2,当天RSI6下穿RSI24
  12. 27 if stockDataFrame.iloc[cnt]['RSI6']<stockDataFrame.iloc[cnt]['RSI24'] and stockDataFrame.iloc[cnt-1] ['RSI6']>stockDataFrame.iloc[cnt-1]['RSI24']:
  13. 28 if sellDate.index(stockDataFrame.iloc[cnt]['Date']) == -1:
  14. 29 sellDate = sellDate+stockDataFrame.iloc[cnt]['Date'] + ','
  15. 30 except:
  16. 31 pass
  17. 32 cnt=cnt+1
  18. 33 print(sellDate)

在第18行到第32行的while循环里,我们计算了基于RSI的卖点,在第22行的语句里,我们制定了第一个规则:RSI6数值大于80,在第23行和第27行,我们在规则一的基础上制定了两个并行的规则,通过上述代码,我们会在sellDate对象里存放RSI6大于80并且RSI6下穿RSI12(或RSI24)的交易日,这些交易日即为卖点。

  1. 34 def sendMail(username,pwd,from_addr,to_addr,msg):
  2. 35 和之前calRSIBuyPoints.py案例中的完全一致
  3. 36 def buildMail(HTMLContent,subject,showFrom,showTo,attachfolder,attachFileName):
  4. 37 和之前calRSIBuyPoints.py案例中的完全一致
  5. 38 subject='RSI卖点分析'
  6. 39 attachfolder='D:\\stockData\\ch10\\'
  7. 40 attachFileName='600584RSI.png'
  8. 41 HTMLContent = '<html><head></head><body>'\
  9. 42 '卖点日期' + sellDate + \
  10. 43 '<img src="cid:'+attachFileName+'"/>'\
  11. 44 '</body></html>'
  12. 45 message = buildMail(HTMLContent,subject,'hsm_computer@163.com','hsm_computer@163.com',attachfolder,attachFileName)
  13. 46 sendMail('hsm_computer','xxx','hsm_computer@163.com','hsm_computer@163.com',message.as_string())

 第34行和第36行的两个用于发送邮件和构建构建的方法和之前案例的完全一致,所以就不再额外说明。

在第38行我们定义的邮件标题是“RSI卖点分析”,在第41行定义的描述正文的HTMLContent对象里,我们存放的也是“卖点日期”,最终是通过第46行调用sendMail方法发送邮件。

运行上述代码,我们能看到如下图所示的邮件,其中包括了卖点日期和指标图。这里通过计算得出的卖点日期比较多,经分析,这些日期之后,股价多有下跌情况。

6 总结和版权说明

本文是给程序员加财商系列,之前的系列文如下:

以预测股票涨跌案例入门基于SVM的机器学习

用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)

    本文力争做到详细,比如代码按行编号,并针对行号详细解释,且图文并茂,所以如果大家感觉可以,请尽量帮忙推荐一下。
本文的内容即将出书,在出版的书里,是用股票案例和大家讲述Python入门时的知识点,敬请期待

有不少网友转载和想要转载我的博文,本人感到十分荣幸,这也是本人不断写博文的动力。关于本文的版权有如下统一的说明,抱歉就不逐一回复了。

1 本文可转载,无需告知,转载时请用链接的方式,给出原文出处,别简单地通过文本方式给出,同时写明原作者是hsm_computer。

2 在转载时,请原文转载 ,谢绝洗稿。否则本人保留追究法律责任的权利。

以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)的更多相关文章

  1. 用Python语言绘制股市OBV指标效果

    我的新书<基于股票大数据分析的Python入门实战>于近日上架,在这篇博文向大家介绍我的新书:<基于股票大数据分析的Python入门实战>里,介绍了这本书的内容.这里将摘录出部 ...

  2. 【转】布同:如何循序渐进学习Python语言

    大家都知道Python语言是一种新兴的编程语言.1989年,Python就由Guido van Rossum发明.Python一直发展态势很好. 原因有几点:1.跨平台性好.Linux.Windows ...

  3. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  4. python学习: 如何循序渐进学习Python语言

    大家都知道Python语言是一种新兴的编程语言.1989年,Python就由Guido van Rossum发明.Python一直发展态势很好. 原因有几点:1.跨平台性好.Linux.Windows ...

  5. 【Python】【爬虫】如何学习Python爬虫?

    如何学习Python爬虫[入门篇]? 路人甲 1 年前 想写这么一篇文章,但是知乎社区爬虫大神很多,光是整理他们的答案就够我这篇文章的内容了.对于我个人来说我更喜欢那种非常实用的教程,这种教程对于想直 ...

  6. 零基础入门学习Python(36)--类和对象:给大家介绍对象

    知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...

  7. 在学习python的Django\Flask\Tornado前你需要知道的,what is web?

    我们都在讲web开发web开发,那到底什么是web呢? 如果你正在学习python三大主流web框架,那这些你必须要知道了 软件开发架构: C/S架构:Client/Server    客户端与服务端 ...

  8. 编程语言千千万,为什么学习Python的占一半?

    如果让你从数百种的编程语言中选择一个入门语言?你会选择哪一个? 是应用率最高.长期霸占排行榜的常青藤 Java?是易于上手,难以精通的 C?还是在游戏和工具领域仍占主流地位的 C++?亦或是占据 Wi ...

  9. 都2020年了,你还不知道怎么学习Python吗?

    众所周知,Python应用广泛,涵盖后端开发.游戏开发.网络爬虫.网站开发.数据挖掘.科学运算.大数据分析.云计算.人工智能等领域,感觉像神一样的存在.Python这么火,那么从入门到精通学习Pyth ...

随机推荐

  1. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十六场

    E: 飞碟解除器 •题目描述 wjyyy在玩跑跑卡丁车的时候,获得了一个飞碟解除器,这样他就可以免受飞碟的减速干扰了.飞碟解除器每秒末都会攻击一次飞碟,但每次只有p/q的概率成功攻击飞碟.当飞碟被成功 ...

  2. HTTP_4_返回结果的HTTP状态码

    状态码:返回请求结果. 状态码种类繁多,以下总结常用的状态码:     类别 信息性状态码 1XX 服务器接受请求,继续处理       成功状态码 200 OK 请求处理成功,并返回资源(响应报文中 ...

  3. 搭建PowerDNS+LAP+NFS+MySQL主从半节点同步实现LAMP架构

    实验环境:(共7台机器) PowerDNS: 192.168.99.110    两台LAP: 192.168.99.120 和 192.168.99.130 NFS服务器:192.168.99.14 ...

  4. 模拟器无Back、Menu等键

    问题如图所示: 解决方法: 1. 打开Android Virtual Device (AVD) Manager --> 选择模拟器,并点击edit --> 勾选KeyBoard中的选项,并 ...

  5. 从动态代理到Spring AOP(中)

    一.前言 上一章节主要介绍了JDK动态代理和CGLIB动态代理:https://www.cnblogs.com/GrimMjx/p/11194283.html 这一章主要结合我们之前学习的动态代理的基 ...

  6. 干货来了!python学习之重难点整理合辑1

    关于装饰器.lambda.鸭子类型.魔法函数的理解仍存有困惑之处,趁周末有时间温故,赶紧去自学了解下相关知识. 1.装饰器是什么: 很多初学者在接触装饰器的时候只做到了肤浅的了解它的概念.组成形态.实 ...

  7. x32下PsSetLoadImageNotifyRoutine的逆向

    一丶简介 纯属兴趣爱好.特来逆向玩玩. PsSetLoadImageNotifyRoutine 是内核中用来监控模块加载.操作系统给我们提供的回调. 我们只需要填写对应的回调函数原型即可进行加监控. ...

  8. go interface衍生的插件化处理

    在设计程序的许多应用场景中我们会遇到大体分为三个阶段的任务流. 第一.入口 一个或多个入口,等待阻塞的.或者主动请求方式的. ============================== 比如任务流需 ...

  9. JAVA开始(基础篇)

    数据类型 Boolean        1位Byte              1个字节(8位)Short             2个字节Char              2个字节Int      ...

  10. Hadoop 系列(四)—— Hadoop 开发环境搭建

    一.前置条件 Hadoop 的运行依赖 JDK,需要预先安装,安装步骤见: Linux 下 JDK 的安装 二.配置免密登录 Hadoop 组件之间需要基于 SSH 进行通讯. 2.1 配置映射 配置 ...