【Python】交互式界面创建函数
文章目錄
- 簡介
- 規則
- 思路
- 示例代碼與運行效果
簡介
運行Python時,在程序運行過程中手動輸入一個函數表達式,并將其作為一個函數進行后續的調用工作,類似于Matlab里面的匿名函數。這個功能使用傳統語言會相當麻煩,當然,我也只是利用了Python的某些功能進行了一些技巧性的操作,大家會發現,正式因為Python的這些有用的函數,動態創建函數成為可能。
規則
創建函數時,乘號依舊是不能省略的,可以使用常規的表達式,例如"3*x^2"表示3x23x^23x2,“2^x”表示2x2^x2x,"e^x"表示exe^xex,"ln(x)"表示lnxlnxlnx。支持復數的四則運算,但是若復數在指數上需要自己額外編寫函數以適應計算。
當動態創建函數完成時,在交互式界面要求能任意調用函數值,若測試成功,則可在剩下的程序中擴展其他功能使用。調用形式類似于以下形式:
思路
我們需要實現的功能類似于在系統編程(ISP),但使用過于復雜的算法是不可取的,在此筆者提供一種非常簡單的方法。首先介紹一下eval()函數,這是一個非常簡單的函數,可以將輸入的一串表達式轉換為結果值(python3),例如(eval(“1+1”)=2),eval(“2**3”)=8。更有價值的一點是,如果import了math模塊,可以直接把math模塊的函數引入eval表達式,例如eval(“log10(100)”=2)。既然我們可以將一個特殊的用戶自定義表達式計算出來,為什么我們不能將其作為一個函數呢?因此,格式化字符串與其結合就成了最好的選擇。例如:
>>> str = "2*%d" >>> eval(str % 2) 4 >>> eval(str % 10) 20這個思路有了之后,我們基本上就匯編寫我們的自定義函數程序了。
示例代碼與運行效果
""" 手動設置函數 輸入一個數學函數并調用它的值 Examples [in0]:9*x+2*x^2 [in1]:f(1) [out1]:11 [in2]:f(2) [out2]:26 """ from math import * import matplotlib.pyplot as plt from pylab import * init_str = input("請輸入一個函數,默認變量為x:\n") # 將所有的x替換為格式化符號 str_fx = init_str.replace("^", "**")def f(x):fx = str_fx.replace("x", "%(x)f") # 所有的"x"換為"%(x)f"return eval(fx % {"x": x}) # 字典類型的格式化字符串,將所有的"x"替換為變量xdef draw(a, b, interp):x = [a+ele*interp for ele in range(0, int((b-a)/interp))]y = [f(ele) for ele in x]plt.figure(1)plt.plot(x, y)xlim(a, b)title(init_str, color="b")plt.show()運行效果如下:
請輸入一個函數,默認變量為x: >? atan(x)+pi*x/2-sin(x)+0.02*2^x >>> for i in range(0,11):print(f(i))0.02 1.5547235053844484 3.4194439445582017 5.980314744723077 8.685805466155546 10.826306675582638 12.389841108348575 14.32748696103622 18.143453699983926 25.425187561533313 38.20311205314207 請輸入一個函數,默認變量為x: atan(x)-log(2*x+1)+3*x^2-4*x draw(0,1,0.01)顯示繪制的函數圖形如下:
可以看出本函數實現了用戶在運行過程中創建函數的功能,繪圖和調用只是最基本的兩個功能,讀者可在本基礎上進行擴展。
轉載請注明出處。
總結
以上是生活随笔為你收集整理的【Python】交互式界面创建函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单的小工具wordlight——让VS
- 下一篇: NodeJs连接Oracle数据库