Python 常用筆記

来源:https://www.cnblogs.com/da-guo/archive/2020/04/13/12639894.html
-Advertisement-
Play Games

記錄 http://blog.sina.com.cn/s/blog_73b339390102yoio.html PE:市盈率 = 股價 / 每股盈利 PEG:(市盈率相對盈利增長比率/市盈增長比率) PEG=PE/(企業年盈利增長率*100) PB:市凈率=股價 / 每股凈資產 PS:市銷率=股價 ...


記錄

http://blog.sina.com.cn/s/blog_73b339390102yoio.html

PE:市盈率 = 股價 / 每股盈利
PEG:(市盈率相對盈利增長比率/市盈增長比率)   PEG=PE/(企業年盈利增長率*100)
PB:市凈率=股價 / 每股凈資產
PS:市銷率=股價 / 每股收入=總市值 / 銷售收入
ROE:凈資產收益率=報告期凈利潤/報告期末凈資產
EPS:每股盈餘=盈餘 / 流通在外股數 
beta值:每股收益=期末凈利潤 / 期末總股本

# 投資收益率計算器
import math
年均投資收益率 = (pow(終值/本金, 1/年限) -1)*100
投資收益本息 = pow((1+預期年收益率),年限)*本金
投資目標年限 = math.log(終值/本金)/math.log(1+預期年收益率)

年化收益率 = ((終值-本金)/本金)/年限  或  利息*365/(本金*天數)
利息收益 = 本金*年化收益率*天數/365

單利終值 = 本金*(1+年利率*年限)          單利現值 = 終值/(1+年利率*年限) 
複利終值 = 本金*((1+年利率)**年限)       複利現值 = 終值/(1+年利率)**年限

等額本金月供 =(貸款本金÷還款月數)+(貸款本金-已歸還本金累計額)×月利率
等額本息月供 = 本金*月利率*[(1+月利率)**(年限*12)]/[(1+月利率)**(年限*12)-1]

 

時間轉換

import time
a = '2020-03-06 19:18:00'
a1 = time.strptime(a,'%Y-%m-%d %H:%M:%S')  #格式化str為time格式
print(time.strftime('%Y%m%d',a1))  #格式化time格式為str
print(time.asctime(time.localtime(time.time())))  #格式化當前時間為   Thu Apr  7 10:29:13 2016
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))   # 格式化成2016-03-20 11:45:39形式
print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))  # 格式化成Sat Mar 28 22:24:24 2016形式

a = "Sat Mar 28 22:24:24 2016"
print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))) # 將格式字元串轉換為時間戳

import calendar
calendar.month(2016, 1)   #輸出2016年1月份的日曆

import pandas as pd
pd.to_datetime('2016-03-20').strftime('%Y%m%d')  #pandas 格式化str輸出

from datetime import datetime,timedelta

datetime.today() # 返回當前時間時分秒都為0
now.isoweekday() # 返回的1-7代表周一--周日
now.weekday() # 返回的0-6代表周一--到周日
datetime.strptime('20150101', "%Y%m%d") # 格式化字元串成datetime格式 (pd.to_datetime('20200130')+timedelta(days=3)).strftime('%Y%m%d') #格式化後三天的日期 now = datetime.now()+timedelta(days=3) print(now.strftime('%Y-%m-%d')) #格式化當天後三天的日期

 

列表排序

import operator,json  

aa = [{"key": "780", "A": ["01", "03", "05", "07", "09"], "T": "1"}, 
{"key": "781", "A": ["01", "03", "05", "07", "09"], "T": "3"}, 
{"key": "782", "A": ["01", "03", "05", "07", "09"], "T": "9"}]
print(json.dumps(aa,indent=2, ensure_ascii=False))
b = sorted(aa,key=operator.itemgetter('key'))  # 列表或json數據排序

#雖說loads是轉回json 但是像這樣key是單引號不能直接轉 需要先dumps
data ="[{'a':1,'b':2,'c':3,'d':4,'e':5}]" 
json1 = json.dumps(data)
print(json.loads(json1))
print(type(json1),json1)

with open('222.txt','r') as f2: a = json.load(f2)
json.dump(aa,open('111.txt','w'),indent=4)

json.loads() #str轉json        json.load() #讀取文本str格式轉json
json.dumps() #輸出成字元串    json.dump() #將json寫入文本


a = ''.join(str(i)+',' for i in df1['cod'].tolist())[:-1]  #list轉換str
[i,v for i,v in enumerate(list)]
a
= ['e', 'a', 'u', 'o', 'i'] a.sort() #升序 正序 a.sort(reverse=True) # 降序 逆序 不能存變數 a.sort(key= lambda x : x[1]) # 根據第二個字母排序 預設根據第一個字母排序 sorted(a) # 可存變數 保留原list 可傳參數 reverse = True 降序 , reverse = False 升序(預設) sorted([[6,7,8],[2,3,4],[1,2,3]], key=lambda x: x[2]) #多維列表 根據元素排序 sorted(lis,key=lambda x:cod.index(x[0])) #多維列表 根據單維列表進行指定排序 lis為多維 cod是單列表 [[k,v] for k,v in dict(new).items() if k not in dict(B1).keys()] #二維列表轉化成dict,比較兩個列表i[0]的差集 ['別墅' if '別墅' in i else '車位' if '車位' in i else '高層' for i in a] #列表推導示例 [[i[0],i[2]] for i in old for v in new if i[0] == v[0] and i[2] != '0'] d = {'lily':25, 'wangjun':22, 'John':25, 'Mary':19} sorted_keys = sorted(d) # 對字典而言,預設是對keys進行排序 print(sorted_keys) sorted_keys1 = sorted(d, key=lambda x : x[1]) print(d_new2) d_new = sorted(d.items(), key=lambda x: x[1], reverse=True) # 根據年齡排序,返回列表形式 print(d_new) d_new = dict(d_new) # 使用內置函數把嵌套列表轉換成字典 print(d_new) sorted_values = sorted(d.values(), key=lambda x:x, reverse=False) # 排序值 print(sorted_values) 輸出: ['John', 'Mary', 'lily', 'wangjun'] ['wangjun', 'Mary', 'lily', 'John'] [('lily', 25), ('John', 25), ('wangjun', 22), ('Mary', 19)] {'lily': 25, 'John': 25, 'wangjun': 22, 'Mary': 19} [19, 22, 25, 25] #互換dick的key和value d = {'lily':25, 'wangjun':22, 'John':25, 'Mary':19} d_new = {v:key for key,v in d.items()} print(d_new) 輸出:{25: 'John', 22: 'wangjun', 19: 'Mary'}

 

編碼轉換

df.to_csv('abdata.csv', mode='a', encoding='utf_8_sig') # pandas導出csv 要指定編碼

#python2 指定utf8
#coding:utf-8
import sys
reload(sys) 
sys.setdefaultencoding("utf-8")

f.write(unicode('%s-日期    成交:%s萬   成交額:%s億'%(i[0],i[1],i[2]),"utf-8")+ '\n')  #py2寫入中文也有毛病要加unicode

 

pandas操作

from sqlalchemy import create_engine
from datetime import datetime,timedelta
import numpy as np
import pandas as pd
import tushare as ts 
import matplotlib.pyplot as plt
from matplotlib import colors
from pylab import mpl  #正常顯示畫圖時出現的中文和符號
import time

ts.set_token("123")
pro = ts.pro_api()

pd.set_option('display.unicode.ambiguous_as_wide', True)  #設置中文列名對齊
pd.set_option('display.unicode.east_asian_width', True)  #設置列名對齊
pd.set_option('display.max_rows',None)     #顯示所有行
pd.set_option('display.max_columns',None)  #顯示所有列
pd.set_option('expand_frame_repr', False)  #設置不換行
pd.set_option('max_colwidth',100)   #設置顯示最大字元
np.set_printoptions(suppress=True)  # 非科學計數法

mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

pd.options.mode.chained_assignment = None 

%matplotlib inline  #jupyter畫圖用
df['aa'].astype('float')  #轉換整列格式
df.reset_index(drop=True)  #重置index索引 並刪除原索引
dfs.drop_duplicates() #去除完全相同的行保留第一行
.loc['a1']#根據index獲取行    .iloc[0].name #根據行號獲取行的某個值
# loc和iloc 可以更換單行、單列、多行、多列的值
df1.loc[0,'age']=25      # 思路:先用loc找到要更改的值,再用賦值(=)的方法實現更換值
df1.iloc[0,2]=25         # iloc:用索引位置來查找

# at 、iat只能更換單個值
df1.at[0,'age']=25      # iat 用來取某個單值,參數只能用數字索引
df1.iat[0,2]=25         # at 用來取某個單值,參數只能用index和columns索引名稱

#pivot()和unstack()實現行轉列
dfcod = counts[['cod','key','日期1','日期2']].set_index(['key','日期1','日期2','cod']).unstack()
df1 , df2 = df[['日期1','日期2','key']] , df.pivot('日期2','cod',v)

#行轉列 列轉行參考
https://www.cnblogs.com/leohahah/p/9778304.html

#新增一行 用append 但必須要得先創建DataFrame才行
df1=df1.append(new,ignore_index=True)   # ignore_index=True,表示不按原來的索引,從0開始自動遞增

#新增一列
tabsdetail['SH'] = sh.append([sh,sh,sh]).tolist()  #sh是Series
tabs.insert(0, '總金額', [m,m*2,m*3,m*4],allow_duplicates=True)  #指定位置添加一列

np.array(df0[['name','key']]).tolist()  #dataframe轉化list

dfdata = pd.DataFrame()
dfdata  = dfdata.append(df1,ignore_index=True) #pandas append必須存入變數 否則不生效

pd.DataFrame([[1,2,3],[1,2,3]],columns=['a','b','c'],index=df0.index)  #創建dataframe
df0 = pd.DataFrame({'id':[3,4,5,6,7,3,4,5],
  'name':[10.54,11.11,12.80,10.05,11.21,10.98,11.12,10.55]},
  index=('a1','a2','a3','a4','a5','a6','a7','a8'))

df0.loc[df0['id'] == 3 ,'key'] = 1
df0.loc[df0['id'] == 5 ,'key'] = 0  # 進行布爾值判斷 輸出符合條件 
df0['key'] = np.where(df0['id'] == 3 ,1,0)

pd.concat([df0, df1], axis=1)  #合併兩個dataframe 
df.index=pd.to_datetime(df.date)  # 將index 改為時間
df=df.sort_index() #排序index
df['ret']=df.close/df.close.shift(1)-1   # .shift(1) 獲取下一個 .shift(-1) 獲取上一個

data.sort_values(by=['標記','時間'],ascending=[False,True])  #多列排序指定升降序

df['當天'].fillna(method='ffill',inplace=True)  #根據一列nan值填充上一個不為nan的值

df['a'] = (df_new.ret+1.0).cumprod()  #計算當前值並累計連乘   .cumsum()累積連加

df1['ret'].diff()   # 比較上一值與當前值的差
[i for i in df["close"].rolling(k).mean()]   # 移動視窗list的均值
df['c'].rolling(window=10, min_periods=1, center=False).mean()  #Series中計算均值

#dataframe行轉列 - 只能根據相同列名不同行名數據轉置   適合matplotlib用 單index日期畫圖   比如多個日期 每個日期中需要轉置的行名不得重覆
df1 = df[['cod','盈虧','日期2']].pivot('日期2','cod','盈虧').rename_axis([None], axis=1)  # pivot 指定列名 行名 數據  只能固定這三個參數
df1 = df1.rename_axis(None, axis=1).reset_index()   # 取消第一個columns  將其拍平
df1.index=pd.to_datetime(df1.日期2)

#dataframe行轉列 - 整合統計用   可以根據多個指定的index  但是set_index必須是前面列表-1的列 不然會亂 前面列表剩下的一個元素就是數據其他為index
dfcod = counts[['cod','key','盈虧','日期2','日期1']].set_index(['key','日期1','日期2','cod']).unstack()
dfcod.columns = [s1 +'_'+ str(s2) for (s1,s2) in dfcod.columns.tolist()]   # 將其拍平
# dfcod.reset_index(inplace=True)   # 重置index 轉成正常的dataframe
dfcod.loc[['前10']]   # 根據key分組顯示index和數據
dfcod

a1.index = a1.index.droplevel()  #刪除一個多索引的index-names


# series 根據list 判斷是否存在
df0[df0['id'].isin([3,4])]   #根據list獲取列表信息
df0[~df0['id'].isin([3,4])]  #根據list獲取列表信息 取反

# series 根據list 排序
df['words'] = df['words'].astype('category')  #必須轉換成這個格式
  df['words'].cat.reorder_categories([1,2,3], inplace=True)  # list長度相等用這個
  df['words'].cat.set_categories([1,2,3], inplace=True) # list多 用這個
  df['words'].cat.set_categories([1,2,3], inplace=True)   # list少  用這個
df.sort_values('words', inplace=True)


#pandas 讀寫mysql
from sqlalchemy import create_engine
mysq = create_engine('mysql+pymysql://root:mysql.123@localhost/abdata?charset=utf8')
df.to_sql('coun',mysq,if_exists='append',index=False)  # 追加數據
df.to_sql('counts',mysq,if_exists='replace',index=False) #刪除並寫入表
df = pd.read_sql_query('select * from cod1',mysq)   # 查詢mysql表


#pymysql讀寫mysql
import pymysql
conn = pymysql.connect('127.0.0.1', 'root', 'mysql.123', 'data',charset='utf8')
cur = conn.cursor()
sql1 = "SELECT * from (SELECT * from data1 ORDER BY id DESC LIMIT %s ) aa order by id" %sum
cur.execute(sql1)
c1 = cur.fetchall()  #讀取mysql
conn.commit()  #寫入mysql

cur.close()
conn.close()

 

DataFrame樣式設置

def show(v):
col = 'black' if v > 0 else 'green'
return 'color:%s'%col

def background_gradient(s, m, M, cmap='PuBu', low=0, high=0.8):
rng = M - m
norm = colors.Normalize(m - (rng * low),M + (rng * high))
normed = norm(s.values)
c = [colors.rgb2hex(x) for x in plt.cm.get_cmap(cmap)(normed)]
return ['" style="color: rgb(128, 0, 0);">' % color for color in c]

def highlight_max(s,m):
is_max = s == m
return ['" style="color: rgb(128, 0, 0);">' if v else '' for v in is_max]


tabs.style.applymap(show).background_gradient(cmap='Reds',axis = 1,low = 0,high = 1,subset = set1).\
apply(background_gradient,cmap='Purples',m=tabs[set2].min().min(),M=tabs[set2].max().max(),low=0,high=1,subset = set2).\
apply(highlight_max,m=tabs[set2].max().max()).background_gradient(cmap='Wistia',axis = 1,subset=['總金額'])

accdeteil.style.applymap(show).background_gradient(cmap='Reds',axis = 1,low = 0,high = 1).\
background_gradient(cmap='Reds',axis = 1,low = 0,high = 1 ,subset=set2).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前10',:'9']).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前20',:'9']).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前05','1_':]).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前15','1_':]).\
background_gradient(cmap='GnBu',axis = 0,low = 0,high = 1 ,subset=['SH_']).\
apply(highlight_max,m=tabs[set2].max().max())


#可參考
https://blog.csdn.net/xiaodongxiexie/article/details/71202279

#顏色樣式
https://matplotlib.org/tutorials/colors/colormaps.html

 

pandas作圖

import matplotlib.pyplot as plt

ax1 = df1[['策略凈值','指數凈值']].plot(figsize=(15,8))  #dataframe折線圖
ax1 = ax1.axhline(y=1,ls=":",c="r"),ax1.legend(loc = 'upper right')   #標記0線和指定圖例位置
plt.title('策略簡單回測%s'%x,size=15)
plt.xlabel('')

for i in range(len(df1)):
    if df1['當天倉位'][i]==0 and df1['當天倉位'].shift(-1)[i]==1:
        plt.annotate('',xy=(df1.index[i],df1.策略凈值[i]),arrowprops=dict(facecolor='r',shrink=0.05))   #標記買賣點
    if df1['當天倉位'][i]==0 and df1['當天倉位'].shift(1)[i]==1:
        plt.annotate('',xy=(df1.index[i],df1.策略凈值[i]),arrowprops=dict(facecolor='g',shrink=0.1))

bbox = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)  #指定文字邊框樣式
t = f'累計收益率:策略{TA1}%,指數{TA2}%;\n年化收益率:策略{AR1}%,指數{AR2}%;'+\
f'\n最大回撤:  策略{MD1}%,指數{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}'
plt.text(df1.index[0], df1['指數凈值'].min(),text,size=13,bbox=bbox)   #指定位置加文字框
ax=plt.gca()   #設置圖形樣式
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()

 

爬蟲

from bs4 import BeautifulSoup
import requests
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
    }

htm = requests.get(url=url,headers=headers,timeout=30,stream=False).text
soup = BeautifulSoup(htm, 'html.parser')
txt = soup.find_all('div', class_='lax-s')
#txt = soup.find('div', class_='qi').children


#etree方式獲取   原文  https://mp.weixin.qq.com/s/c2Sg_LVTjOokePY2lxCGSA
import requests
import pandas as pd
from pprint import pprint
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")

for i in range(1,15):
    print("正在爬取第" + str(i) + "頁的數據")
    url = "https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,"+str(i)+'.html?'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
    }
    web = requests.get(url, headers=headers)
    web.encoding = "gbk"
    dom = etree.HTML(web.text)
    #print(etree.tostring(dom, encoding="utf-8", pretty_print=True).decode("utf-8")) #列印整個html 不能直接print
    # 1、崗位名稱
    job_name = dom.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@title')
    # 2、公司名稱
    company_name = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t2"]/a[@target="_blank"]/@title')
    # 3、工作地點
    address = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t3"]/text()')
    # 4、工資:工資這一列有空值,為了保證數據框的一致性。採取以下方式進行數據的獲取
    salary_mid = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t4"]')
    salary = [i.text for i in salary_mid]  #這裡None也占一個元素 保持長度一致
    # 5、發佈日期
    release_time = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t5"]/text()')
    #----------------------------------------------------------------------------------------------#
    # 下麵獲取二級網址的信息。為了獲取二級網址的信息,首先需要獲取二級網址的url
    #
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 模仿MATLAB構建的底層繪圖庫 廢話不寫了,就直接甩用法咯,有問題留言交流~ 待更新 ...
  • 初學Spring真是傷不起呀,連一個Mybatis的配置都整了一天才弄出來,太不容易了,所以這裡一定要把它記錄下來,防止自已到時候又忘記了,雖然前後經歷了好長時間,但好在磕磕碰碰的弄出來了,也算給自已一點小安慰吧。 其實Mybatis的配置網上的資料真的不要太多,百度一下會找到好多,也許就是因為太多 ...
  • 錯誤記錄:Data too long for column 'xxx' at row 1使用Flask-sqlalchemy操作數據時報錯: "Data too long for column 'chapter_list' at row 1" 在網上找了很久,發現不是編碼問題,也不是字元集的問題。 ...
  • 代碼 1 @Slf4j 2 public class IntegerCompare { 3 public static void doCompare() { 4 5 Integer a = 127; //Integer.valueOf(127) 6 Integer b = 127; //Intege ...
  • 前言 文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者: 王平 PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取http://t.cn/A6Zvjdun 聊下 Python 的代碼混淆,對 Python 的 ...
  • Linux最為人稱道的莫過於它的自由精神,所有源代碼唾手可得。侯捷先生雲:“源碼在前,了無秘密"。是的,但是我們在面對它的時候,為什麼卻總是因為這種規模和層面所造就的陡峭學習曲線陷入困頓呢?很多朋友就此倒下,縱然I inux世界繁花似錦,縱然內核天空無邊廣闊。但是,眼前的迷霧重重,心中的陰霾又怎能被 ...
  • Mybatis框架學習筆記一 基礎mybatis註解配置 1.編寫jdbcConfig.properties配置文件 2.項目是基於maven創建的所以需要先導入依賴 3.編寫實體類,與資料庫中的表對應(變數名與資料庫表相對應) 註意:最好自動生成不然容易寫錯 4.編寫持久層介面 5.編寫SqlMa ...
  • PHP 工作中常用的字元串函數 一、關於字元串大小寫轉換的函數 1、strtoupper($string):將字元串$string中的字母轉換成大寫,並將轉化後的字元串返回; $str = '這是一個string'; echo strtoupper($str); //輸入結果: //這是一個STRI ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...