Q_04_03 局部變量

局部變量 

通過使用let關鍵字,可以將Q#中的任何類型的值分配給變量,以便在操作或函數內重用。 例如:

Q#
 let measurementOperator = [PauliX; PauliZ; PauliZ; PauliX; PauliI]; 

這將Pauli運算符的特定數組分配給稱爲measurementOperator變量。

Tip

請注意,我們不需要明確指定新變量的類型,因爲let語句右側的表達式是明確的,並且類型由編譯器推斷。

Q#中的變量是不可變的 ,這意味着一旦以這種方式定義變量,就不能再以任何方式進行更改。 這可以進行多種有益的優化,包括對應用操作的Adjoint變體進行重新排序的變量的經典邏輯的優化。

如上所述使用let綁定的變量對於特定範圍是本地的,例如操作的主體或for循環的內容。

可變性

作爲使用let創建變量的替代方法, mutable關鍵字將創建一個特殊的可變變量,可在使用set關鍵字初始創建後進行更改。 如果一個可變變量是一個數組類型,那麼該數組的元素也可以被改變。 例如,這對於以編程方式創建數組非常有用:

Q#
 function Squares(nSquares : Int) : Int[] {
    mutable squares = new Int[nSquares];
    for (idxSquare in 0..nSquares - 1) {
        set squares[idxSequare] = idxSquare ^ 2;
    }
    return squares;
} 

上面的例子也說明了Q#中可變性的另一個重要特性:綁定到可變局部變量的數組本身是可變的。 正如我們在討論數組類型時會更詳細地看到的那樣,普通變量不是這樣。 非正式地說,從不可變變量遞減的集合是不可變的,而從可變變量遞減的集合是可變的。

沒有操作或函數調用Squares可以觀察到局部變量squares被定義爲可變的; 可變性是調用者不需要擔心的實現細節。 這爲隔離專門功能和操作中的可變性提供了一種重要方法。 特別是,即使使用可變變量的操作不能使用adjoint auto ,操作也可以調用使用可變性的函數。 由於這個原因,使可變性儘可能短而緊湊的函數和操作是一個很好的做法,所以量子程序的其餘部分可以用普通的不可變變量來編寫。

解構

除了分配單個變量之外, let關鍵字還允許解開元組類型的內容。 據說這種形式的分配解構了該元組的元素。 例如,如果我們用一個元組對一個哈密爾頓算子進行建模,那麼我們可以使用解構來訪問我們需要在該項下模擬的不同數據:

Q#
 // Represents H = 3.1 X_0 Z_1.
let (coefficient, (paulis, idxQubits)) = (3.1, ([PauliX; PauliZ], [0, 1])); 

我們也可以使用解構來訪問用戶定義類型的不同部分:

Q#
 newtype Quaternion = (Double, Double, Double, Double);
let (realPart, iPart, jPart, kPart) = Quaternion(1.0, -2.0, 3.5, 0.0); 
發佈了26 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章