天天看點

【Python】互動式界面建立函數簡介規則思路示例代碼與運作效果

文章目錄

  • 簡介
  • 規則
  • 思路
  • 示例代碼與運作效果

簡介

運作Python時,在程式運作過程中手動輸入一個函數表達式,并将其作為一個函數進行後續的調用工作,類似于Matlab裡面的匿名函數。這個功能使用傳統語言會相當麻煩,當然,我也隻是利用了Python的某些功能進行了一些技巧性的操作,大家會發現,正式因為Python的這些有用的函數,動态建立函數成為可能。

規則

建立函數時,乘号依舊是不能省略的,可以使用正常的表達式,例如"3*x^2"表示 3 x 2 3x^2 3x2,“2^x”表示 2 x 2^x 2x,"e^x"表示 e x e^x ex,"ln(x)"表示 l n x lnx lnx。支援複數的四則運算,但是若複數在指數上需要自己額外編寫函數以适應計算。

當動态建立函數完成時,在互動式界面要求能任意調用函數值,若測試成功,則可在剩下的程式中擴充其他功能使用。調用形式類似于以下形式:

2**x-8*x+x^2-3
>>> f(9)
518.0
>>> f(0)
-2.0
>>> for i in range(0,11):
	print("f(%.3f)=%.3f"%(i,f(i)))

	
f(0.000)=-2.000
f(1.000)=-8.000
f(2.000)=-11.000
f(3.000)=-10.000
f(4.000)=-3.000
f(5.000)=14.000
f(6.000)=49.000
f(7.000)=118.000
f(8.000)=253.000
f(9.000)=518.000
f(10.000)=1041.000
           

思路

我們需要實作的功能類似于在系統程式設計(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"替換為變量x


def 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】互動式界面建立函數簡介規則思路示例代碼與運作效果

可以看出本函數實作了使用者在運作過程中建立函數的功能,繪圖和調用隻是最基本的兩個功能,讀者可在本基礎上進行擴充。

轉載請注明出處。