def main() a=077 b=a|3 print(‘The a &b(decimal) is %d ’,a)
的值为:‘, a, ‘,十进制为:‘, int(str(a), 8))
对于这个问题,我的回答是:
这段代码使用了八进制表示法来给变量 a 赋值,即 a 的值为十进制的 63。在第二行代码中,使用了按位或运算符(|)将 a 和十进制的 3 进行了按位或运算,得到的结果为十进制的 63。最后使用 print() 函数输出了变量 a 的值(使用逗号隔开的方式)和 a 的十进制值(使用 int() 函数将八进制转化为十进制)。
import pandas as pd from sqlalchemy import create_engine # 连接到数据库 engine = create_engine('mysql+pymysql://user:password@localhost/database') # 获取所有表格的名称 with engine.connect() as conn, conn.begin(): tables = conn.execute("SHOW TABLES").fetchall() # 遍历所有表格 for table in tables: table_name = table[0] table_name_quoted = '' + table_name + '' # 检查是否存在名为'a'的列,如果不存在则添加'a'和'b'列 with engine.connect() as conn, conn.begin(): a_column = conn.execute("SHOW COLUMNS FROM " + table_name_quoted + " LIKE 'a'").fetchone() if a_column is None: conn.execute("ALTER TABLE " + table_name_quoted + " ADD COLUMN a DECIMAL(10,2)") conn.execute("ALTER TABLE " + table_name_quoted + " ADD COLUMN b DECIMAL(10,2)") # 查询net_mf_amount列的数据 query = "SELECT trade_date, net_mf_amount FROM " + table_name_quoted + " ORDER BY trade_date DESC" df = pd.read_sql_query(query, engine) # 计算a和b列 a_column = [] b_column = [] for i in range(len(df)): if i == 0: a_column.append(None) b_column.append(None) else: if pd.notnull(df.iloc[i]['net_mf_amount']) and pd.notnull(df.iloc[i-1]['net_mf_amount']): if i-2 >= 0: if pd.notnull(df.iloc[i-2]['net_mf_amount']): a = df.iloc[i]['net_mf_amount'] - df.iloc[i-1]['net_mf_amount'] b = df.iloc[i]['net_mf_amount'] - df.iloc[i-2]['net_mf_amount'] a_column.append(a) b_column.append(b) else: j = i-3 while j >= 0: if pd.notnull(df.iloc[j]['net_mf_amount']): a = df.iloc[i]['net_mf_amount'] - df.iloc[i-1]['net_mf_amount'] b = df.iloc[i]['net_mf_amount'] - df.iloc[j]['net_mf_amount'] a_column.append(a) b_column.append(b) break j -= 1 else: a = df.iloc[i]['net_mf_amount'] - df.iloc[i-1]['net_mf_amount'] b = None a_column.append(a) b_column.append(b) else: a_column.append(None) b_column.append(None) # 将结果保存到数据库 with engine.connect() as conn, conn.begin(): for i in range(len(df)): conn.execute("UPDATE " + table_name_quoted + " SET a=%s, b=%s WHERE trade_date=%s", (a_column[i], b_column[i], df.iloc[i]['trade_date'])) # 关闭连接 engine.dispose() 有5000个表格,使用多线程,线程池
可以使用Python内置的concurrent.futures
模块实现多线程处理。具体实现可以参考以下代码:
import concurrent.futures
def process_table(table_name):
table_name_quoted = '' + table_name + ''
with engine.connect() as conn, conn.begin():
a_column = conn.execute("SHOW COLUMNS FROM " + table_name_quoted + " LIKE 'a'").fetchone()
if a_column is None:
conn.execute("ALTER TABLE " + table_name_quoted + " ADD COLUMN a DECIMAL(10,2)")
conn.execute("ALTER TABLE " + table_name_quoted + " ADD COLUMN b DECIMAL(10,2)")
query = "SELECT trade_date, net_mf_amount FROM " + table_name_quoted + " ORDER BY trade_date DESC"
df = pd.read_sql_query(query, engine)
a_column = []
b_column = []
for i in range(len(df)):
if i == 0:
a_column.append(None)
b_column.append(None)
else:
if pd.notnull(df.iloc[i]['net_mf_amount']) and pd.notnull(df.iloc[i-1]['net_mf_amount']):
if i-2 >= 0:
if pd.notnull(df.iloc[i-2]['net_mf_amount']):
a = df.iloc[i]['net_mf_amount'] - df.iloc[i-1]['net_mf_amount']
b = df.iloc[i]['net_mf_amount'] - df.iloc[i-2]['net_mf_amount']
a_column.append(a)
b_column.append(b)
else:
j = i-3
while j >= 0:
if pd.notnull(df.iloc[j]['net_mf_amount']):
a = df.iloc[i]['net_mf_amount'] - df.iloc[i-1]['net_mf_amount']
b = df.iloc[i]['net_mf_amount'] - df.iloc[j]['net_mf_amount']
a_column.append(a)
b_column.append(b)
break
j -= 1
else:
a = df.iloc[i]['net_mf_amount'] - df.iloc[i-1]['net_mf_amount']
b = None
a_column.append(a)
b_column.append(b)
else:
a_column.append(None)
b_column.append(None)
with engine.connect() as conn, conn.begin():
for i in range(len(df)):
conn.execute("UPDATE " + table_name_quoted + " SET a=%s, b=%s WHERE trade_date=%s", (a_column[i], b_column[i], df.iloc[i]['trade_date']))
print("Processed table:", table_name)
if __name__ == '__main__':
engine = create_engine('mysql+pymysql://user:password@localhost/database')
with engine.connect() as conn, conn.begin():
tables = conn.execute("SHOW TABLES").fetchall()
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(process_table, [table[0] for table in tables])
engine.dispose()
在main
函数中,首先获取所有表格的名称,然后使用ThreadPoolExecutor
创建一个最大线程数为10的线程池。使用map
方法将process_table
函数和表格名称列表传入,线程池会自动分配任务并执行。每个线程都会执行process_table
函数,对一张表格进行处理。
在process_table
函数中,首先检查是否存在名为'a'的列,如果不存在则添加'a'和'b'列。然后从数据库中查询数据到DataFrame
中,并对每一行数据计算'a'和'b'列的值。最后将结果更新到数据库中。每个线程在处理完一张表格后,会输出一条信息,表示该表格处理完成。
ip = input('输入IP地址:') if ip.isdigit(): ip1=int(ip) # print("字符串中只包含数字") if ip1>4294967296: print('IP地址不合法') else: def ip2decimalism(ip): dec_value = 0 v_list = ip.split('.') v_list.reverse() t = 1 for v in v_list: dec_value += int(v) * t t = t * (2 ** 8) return dec_value def decimalism2ip(dec_value): ip = '' t = 2 ** 8 for _ in range(4): v = dec_value % t ip = '.' + str(v) + ip dec_value = dec_value // t ip = ip[1:] return ip if __name__ == '__main__': while(1): # ip = input() dec_value = ip2decimalism(ip) # print(dec_value) ip = decimalism2ip(dec_value) print('IP地址是:',ip) break else: ip_list = ip.split(".") ipgeshi=len(ip_list) if ipgeshi >3 and ipgeshi<5: for v in ip_list: v1=int(v) if v1>254: print('IP地址不合法') break else: for i in range(len(ip_list)): ele = bin(int(ip_list[i]))#得到 "0b11000000 0b10101000 0b1100 0b1001111" ip_list[i] = ele[2:]#把0b切掉 得到后面的二进制01内容 #ip_list[i]=ip_list[i].strip("0b")也可以去掉 if len(ip_list[i]) < 8:#补全到八位 strl = "0" * (8 - len(ip_list[i])) + ip_list[i] ip_list[i] = strl val = "".join(ip_list) print('十进制IP地址是:',int("0b"+val, base=2)) break else: print('IP地址不合法')添加窗口
以下是将输入 IP 地址转换为十进制或二进制 IP 地址的代码,结合了 Tkinter 创建的可视化界面:
import tkinter as tk
def ip_conversion():
ip = entry.get()
if ip.isdigit():
ip1 = int(ip)
if ip1 > 4294967296:
result_label.config(text="IP地址不合法")
else:
decimal_ip = ip2decimalism(ip)
binary_ip = decimalism2binary(decimal_ip)
result_label.config(text="IP地址是:" + decimal_ip + "\n32位二进制IP地址是:" + binary_ip)
else:
ip_list = ip.split(".")
ipgeshi = len(ip_list)
if ipgeshi > 3 and ipgeshi < 5:
for v in ip_list:
v1 = int(v)
if v1 > 254:
result_label.config(text="IP地址不合法")
break
else:
for i in range(len(ip_list)):
ele = bin(int(ip_list[i]))
ip_list[i] = ele[2:]
if len(ip_list[i]) < 8:
strl = "0" * (8 - len(ip_list[i])) + ip_list[i]
ip_list[i] = strl
val = "".join(ip_list)
decimal_ip = str(int("0b" + val, base=2))
binary_ip = decimalism2binary(int(decimal_ip))
result_label.config(text="IP地址是:" + decimal_ip + "\n32位二进制IP地址是:" + binary_ip)
break
else:
result_label.config(text="IP地址不合法")
def ip2decimalism(ip):
dec_value = 0
v_list = ip.split('.')
v_list.reverse()
t = 1
for v in v_list:
dec_value += int(v) * t
t = t * (2 ** 8)
return str(dec_value)
def decimalism2binary(dec_value):
binary_ip = format(dec_value, '032b')
formatted_binary_ip = '.'.join([binary_ip[i:i+8] for i in range(0, 32, 8)])
return formatted_binary_ip
# 创建窗口
window = tk.Tk()
window.title("IP地址转换")
window.geometry("300x250")
# 创建输入框和按钮
entry = tk.Entry(window)
entry.pack(pady=10)
convert_button = tk.Button(window, text="转换", command=ip_conversion)
convert_button.pack()
# 创建结果标签
result_label = tk.Label(window, text="")
result_label.pack(pady=10)
# 运行窗口主循环
window.mainloop()
通过运行这段代码,你可以在窗口中输入一个 IP 地址,然后选择转换为十进制或二进制 IP 地址,并点击转换按钮。程序将会在窗口中显示转换结果,包括十进制 IP 地址和32位二进制 IP 地址。
相关推荐















