Qiskit汉化-0.Prerequisites

0.1 Setting Up Your Environment

这是一个全面的指南,用于在您的个人计算机上设置使用Qiskit Textbook的环境。这将帮助您重现您在教科书网站上看到的结果。Qiskit Textbook是在Jupyter notebooks中编写的。Notebooks和教科书网站是仅有的两个完全支持Qiskit Textbook的媒体。

安装qiskit_textbook包

Qiskit Textbook提供了一些特定于教科书的工具和组件。这不是Qiskit的一部分,可以通过qiskit_textbook包获得。通过PipGit安装此包的最快方法是使用以下命令:

pip install git+https://github.com/qiskit-community/qiskit-textbook.git#subdirectory=qiskit-textbook-src

或者,您可以从Github下载qiskit-textbook-src文件夹并在包含此文件夹的目录下执行指令:

pip install ./qiskit-textbook-src

准确重现qiskit教科书中预先呈现的输出的步骤(可选)

1. 设置默认使用Matplotlib绘图

QuantumCircuit.draw()qiskit.visualization.circuit_drawer()的默认后端是文本后端。然而,根据您的本地环境,您可能希望更改这些默认值,以更适合您的用例。这是通过用户配置文件完成的。默认情况下,用户的配置文件应该是位于~/.qiskit/下的settings.conf文件。
Qiskit Textbook默认使用Matplotlib库绘制电路。要重现Qiskit Textbook中给出的可视化效果,请创建一个名为settings.conf文件(通常在~/.qiskit/中找到),内容如下:

[default]
circuit_drawer = mpl

2. 设置默认图像格式为SVG

根据需要,您可以将下面这行代码行添加到ipython_kernel_config.py文件(通常在~/.ipython/profile_default/中找到),以将默认图像格式从PNG设置为扩展性更好的SVG格式:

c.InlineBackend.figure_format = 'svg'

3. 同步教科书中使用的Qiskit版本

您将在大多数教程的末尾找到一个代码片段,其中包含本教程中使用的qiskit包的版本信息。如果您发现语法和/或输出与教程不一致,请尝试使用相同的版本。

想要检查您当前计算机中安装的版本,请在Python shell或Jupyter Notebook中运行以下命令:

import qiskit.tools.jupyter
%qiskit_version_table

 

0.2 Python and Jupyter Notebooks

Python是一种不需要编译的编程语言。您可以逐行运行它(这就是我们在notebook中使用它的方式)。因此,如果您是编程新手,Python是一个很好的开始。当前版本是Python 3,也就是我们在这里要使用的版本。

用Python编写代码的一种方法是使用Jupyter notebook。这可能是将编程、文本和图像结合起来的最佳方式。在notebook里,所有内容都在单元格中。文本单元格和代码单元格是最常见的。如果您正在使用Jupyter notebook阅读本节内容,则您目前阅读的文本正位于文本单元格中。您可以在下面找到一个代码单元格。

要运行代码单元格的内容,可以单击它并按Shift + Enter。如果左边有一个小箭头,您点击它也可以运行。

1 + 1

 2
 

如果您正在使用Jupyter notebook阅读本节内容,请在阅读过程中执行每个代码单元格。

a = 1
b = 0.5
a + b

 1.5
 

上面我们创建了两个变量,我们称之为ab,并给它们赋值。然后我们把它们相加。在Python中,像这样简单的算术运算非常简单。

Python中的变量有很多种形式。下面是一些例子。

an_integer = 42 # 一个整数
a_float = 0.1 # 一个具有固定精度的非整数
a_boolean = True # 一个可以是True或False的值
a_string = '''just enclose text between two 's, or two "s, or do what we did for this string''' # 文本
none_of_the_above = None # 没有任何实际的值或变量类型

除了数字,我们可以使用的另一种数据结构是列表。

a_list = [0,1,2,3]

Python中的列表可以包含任意类型的变量。

a_list = [ 42, 0.5, True, [0,1], None, 'Banana' ]

在Python中,列表索引从0开始(与Fortran等语言不同)。因此,以下是您如何访问上述列表开头的42。

a_list[0]

 42
 

类似的数据结构是元组(tuple)。

a_tuple = ( 42, 0.5, True, [0,1], None, 'Banana' )
a_tuple[0]

 42
 

列表和元组的一个主要区别是列表元素可以更改,

a_list[5] = 'apple'
print(a_list)

 [42, 0.5, True, [0, 1], None, ‘apple’]
 

而元组元素不能更改。

a_tuple[5] = 'apple'

 ---------------------------------------------------------------------------
 TypeError Traceback (most recent call last)
 <ipython-input-9-42d08f1e5606> in <module>
 ----> 1 a_tuple[5] = ‘apple’

 TypeError: ‘tuple’ object does not support item assignment
 

此外,我们可以在列表的末尾添加一个元素,这是元组不能做的。

a_list.append( 3.14 )
print(a_list)

 [42, 0.5, True, [0, 1], None, ‘apple’, 3.14]
 

另一个有用的数据结构是字典。它存储了一组值,每个值都由唯一的键标记。

值可以是任何数据类型。键可以是任何足够简单的值(整数、浮点数、布尔值、字符串)。它不能是列表,但可以是元组。

a_dict = { 1:'This is the value, for the key 1', 'This is the key for a value 1':1, False:':)', (0,1):256 }

通过键可以访问值。

a_dict['This is the key for a value 1']

 1
 

只要为新键提供新值,就可以添加新的键/值对。

a_dict['new key'] = 'new_value'

想要遍历一定范围内的数字,语法如下:

for j in range(5):
    print(j)

 0
 1
 2
 3
 4
 

注意,range(n)函数(默认)从0开始,至n-1结束。

您也可以循环任何“可迭代”对象,例如列表

for j in a_list:
    print(j)

 42
 0.5
 True
 [0, 1]
 None
 apple
 3.14
 

或字典。

for key in a_dict:
    value = a_dict[key]
    print('key =',key)
    print('value =',value)
    print()

 key = 1
 value = This is the value, for the key 1

 key = This is the key for a value 1
 value = 1

 key = False
 value = :slight_smile:

 key = (0, 1)
 value = 256

 key = new key
 value = new_value
 

条件语句由ifelifelse组成,语法如下。

if 'strawberry' in a_list:
    print('We have a strawberry!')
elif a_list[5]=='apple':
    print('We have an apple!')
else:
    print('Not much fruit here!')

 We have an apple!
 

导入包可以使用如下一行代码完成。

import numpy

numpy包对于处理数学问题很重要

numpy.sin( numpy.pi/2 )

 1.0
 

我们必须在每个numpy命令前面加上numpy.,以便它知道如何找到numpy中定义的命令。为了节省书写,通常使用如下方式:

import numpy as np
np.sin( np.pi/2 )

 1.0
 

接下来您只需要使用缩写的名字。大多数人使用np,但您可以选择您喜欢的。

您也可以直接从numpy中获取所有内容

from numpy import *

然后,您可以直接使用这些命令。但这可能会导致包之间相互干扰,所以要谨慎使用。

sin( pi/2 )

 1.0
 

如果您想做三角函数、线性代数等,您可以使用numpy。绘图使用matplotlib。对于图论,请使用networkx。对于量子计算,请使用qiskit。无论您想要什么,大概都会有一个包来帮助您。

在任何语言中,都需要了解如何创建函数。

下面是一个函数,它的名字被选为do_some_maths,它的输入名为Input1Input2,输出名为the_answer

def do_some_maths ( Input1, Input2 ):
    the_answer = Input1 + Input2
    return the_answer

它的用法如下:

x = do_some_maths(1,72)
print(x)

 73
 

如果您给某个函数一个对象,这个函数调用这个对象的方法来改变它的状态,那么这个效果会持续存在。如果这就是您要做的,您不需要返回任何内容。例如,让我们使用列表的append方法来实现它。

def add_sausages ( input_list ):
    if 'sausages' not in input_list:
        input_list.append('sausages')
print('List before the function')
print(a_list)

add_sausages(a_list) # function called without an output

print('\nList after the function')
print(a_list)

 List before the function
 [42, 0.5, True, [0, 1], None, ‘apple’, 3.14]

 List after the function
 [42, 0.5, True, [0, 1], None, ‘apple’, 3.14, ‘sausages’]
 

随机性可以使用random包生成。

import random
for j in range(5):
    print('* Results from sample',j+1)
    print('\n    Random number from 0 to 1:', random.random() )
    print("\n    Random choice from our list:", random.choice( a_list ) )
    print('\n')

 * Results from sample 1

     Random number from 0 to 1: 0.9565207808448243

     Random choice from our list: 3.14

 * Results from sample 2

     Random number from 0 to 1: 0.2965136670559021

     Random choice from our list: sausages

 * Results from sample 3

     Random number from 0 to 1: 0.5742595097667611

     Random choice from our list: 3.14

 * Results from sample 4

     Random number from 0 to 1: 0.8530438802121619

     Random choice from our list: True

 * Results from sample 5

     Random number from 0 to 1: 0.1329354419675386

     Random choice from our list: None

 

这些是基础知识。现在您所需要的只是一个搜索引擎,以及知道谁值得在Stack Exchange上收听的直觉。接下来您就可以用Python做任何事情了。您的代码可能不是最“Python化”的,但只有Python爱好者真正关心这一点。

1 Like