Ввести в ячейки таблицы следующие массивы констант. Ветвления
Начиная с версии 3.6 в Python появился новый тип строк — f-строки , которые буквально означают «formatted string». Эти строки улучшают читаемость кода, а также работают быстрее чем другие способы форматирования. F-строки задаются с помощью литерала «f» перед кавычками.
>>> "обычная строка" >>> f"f-строка"f-строки - это пятый способ (sic!) форматирования строк в Python, который очень похож на использование метода format().
Вспомним все 5 способов форматирования.
5 способов форматирования строк
1. Конкатенация. Грубый способ форматирования, в котором мы просто склеиваем несколько строк с помощью операции сложения:
>>> name = "Дмитрий" >>> age = 25 >>> print("Меня зовут " + name + ". Мне " + str(age) + " лет.") >>>2. %-форматирование. Самый популярный способ, который перешел в Python из языка С. Передавать значения в строку можно через списки и кортежи, а также и с помощью словаря. Во втором случае значения помещаются не по позиции, а в соответствии с именами.
>>> name = "Дмитрий" >>> age = 25 >>> print("Меня зовут %s. Мне %d лет." % (name, age)) >>> Меня зовут Дмитрий. Мне 25 лет. >>> print("Меня зовут %(name)s. Мне %(age)d лет." % {"name": name, "age": age}) >>> Меня зовут Дмитрий. Мне 25 лет.3. Template-строки. Этот способ появился в Python 2.4, как замена %-форматированию (PEP 292), но популярным так и не стал. Поддерживает передачу значений по имени и использует $-синтаксис как в PHP.
>>> from string import Template >>> name = "Дмитрий" >>> age = 25 >>> s = Template("Меня зовут $name. Мне $age лет.") >>> print(s.substitute(name=name, age=age)) >>> Меня зовут Дмитрий. Мне 25 лет.4. Форматирование с помощью метода format(). Этот способ появился в Python 3 в качестве замены %-форматированию. Он также поддерживает передачу значений по позиции и по имени.
>>> name = "Дмитрий" >>> age = 25 >>> print("Меня зовут {}. Мне {} лет.".format(name, age) >>> Меня зовут Дмитрий. Мне 25 лет. >>> print("Меня зовут {name} Мне {age} лет.".format(age=age, name=name) >>> Меня зовут Дмитрий. Мне 25 лет.5. f-строки. Форматирование, которое появилось в Python 3.6 (PEP 498). Этот способ похож на форматирование с помощью метода format(), но гибче, читабельней и быстрей.
>>> name = "Дмитрий" >>> age = 25 >>> print(f"Меня зовут {name} Мне {age} лет.") >>> Меня зовут Дмитрий. Мне 25 лет.Погружене в f-строки
f-строки делают очень простую вещь — они берут значения переменных, которые есть в текущей области видимости, и подставляют их в строку. В самой строке вам лишь нужно указать имя этой переменной в фигурных скобках.
>>> name = "Дмитрий" >>> age = 25 >>> print(f"Меня зовут {name} Мне {age} лет.") >>> Меня зовут Дмитрий. Мне 25 лет.f-строки также поддерживают расширенное форматирование чисел:
>>> from math import pi >>> print(f"Значение числа pi: {pi:.2f}") >>> Значение числа pi: 3.14С помощью f-строк можно форматировать дату без вызова метода strftime():
>>> from datetime import datetime as dt >>> now = dt.now() >>> print(f"Текущее время {now:%d.%m.%Y %H:%M}") >>> Текущее время 24.02.2017 15:51Они поддерживают базовые арифметические операции. Да, прямо в строках:
>>> x = 10 >>> y = 5 >>> print(f"{x} x {y} / 2 = {x * y / 2}") >>> 10 x 5 / 2 = 25.0Позволяют обращаться к значениям списков по индексу:
>>> planets = ["Меркурий", "Венера", "Земля", "Марс"] >>> print(f"Мы живим не планете {planets}") >>> Мы живим не планете ЗемляА также к элементам словаря по ключу:
>>> planet = {"name": "Земля", "radius": 6378000} >>> print(f"Планета {planet["name"]}. Радиус {planet["radius"]/1000} км.") >>> Планета Земля. Радиус 6378.0 км.Причем вы можете использовать как строковые, так и числовые ключи. Точно также как в обычном Python коде:
>>> digits = {0: "ноль", "one": "один"} >>> print(f"0 - {digits}, 1 - {digits["one"]}") >>> 0 - ноль, 1 - одинВы можете вызывать в f-строках методы объектов:
>>> name = "Дмитрий" >>> print(f"Имя: {name.upper()}") >>> Имя: ДМИТИРИЙА также вызывать функции:
>>> print(f"13 / 3 = {round(13/3)}") >>> 13 / 3 = 4f-строки очень гибкий и мощный инструмент для создания самых разнообразных шаблонов.
Со всеми возможностя f-строк вы можете ознакомится в PEP498 .
Производительность
F-строки не только гибкие, но и быстрые. И для сравнения производительности разных подходов к форматированию я подготовил два шаблона:
- простой , в который нужно вставить всего два значения: строку и число;
- сложный , данные для которого собираются из разных переменных, а внутри происходит преобразование даты, вещественного числа, а также округление.
Финальная простая строка получается такой:
Привет, меня зовут Дмитрий. Мне 27 лет.
Сложная строка на выходе такая:
Сегодня 24.02.2017.
Мы живём на планете Земля. Её радиус 6378 км., а масса 5.973e+24
Период обращения планеты вокруг Солнца 365 дней.
Если ввести формулу массива , вы чаще всего использовать диапазон ячеек на листе, но вам не нужно. Вы также можете использовать константы массива , просто введите в строке формул фигурные скобки значения: {}. Затем вы можете имя константы чтобы облегчить для повторного использования.
Константы можно использовать как в формулах массива, так и отдельно от них.
Использование константы для ввода значений в столбец
Чтобы ввести значения в один столбец, например в три ячейки столбца C, сделайте следующее.
Использование константы для ввода значений в строку
Чтобы быстро ввести значения в одну строку, например в ячейки F1, G1 и H1, сделайте следующее.
Использование константы для ввода значений в несколько столбцов и строк
Использование константы в формуле
Теперь, когда вы уже познакомились с константами массива, рассмотрим практический пример.
Введите или скопируйте и вставьте в любую пустую ячейку следующую формулу, а затем нажмите клавиши CTRL+SHIFT+ВВОД:
=СУММ(A1:E1*{1,2,3,4,5})
В ячейке A3 появится значение 85 .
Что произошло? Вы умножили значение в ячейке A1 на 1, значение в ячейке B2 на 2 и т. д, а затем с помощью функции СУММ выполнили сложение этих результатов. Эту же формулу вы могли ввести в виде =СУММ(A1*1,B1*2,C1*3,D1*4,E1*5) .
А при желании можно ввести оба набора значений в виде констант массива:
=СУММ({3,4,5,6,7}*{1,2,3,4,5})
Для этого скопируйте формулу, выделите пустую ячейку, вставьте формулу в строку формул, а затем нажмите клавиши CTRL+SHIFT+ВВОД. Вы получите такой же результат.
Примечания: Если константы не работают
"Array of const" это массив переменных, декларированных как константы. Непосредственно они представлены структурой TVarRec. Скобки просто ограничивают массив. Массив констант дает вам возможность передавать процедуре переменное количество параметров type-safe (безопасным) способом. Вот пример:
type
TVarRec = record
Data: record case Integer of
0 : (L: LongInt ) ;
1 : (B: Boolean ) ;
2 : (C: Char ) ;
3 : (E: ^Extended) ;
4 : (S: ^string) ;
5 : (P: Pointer ) ;
6 : (X: PChar ) ;
7 : (O: TObject ) ;
end ;
Tag: Byte ;
Stuff: array [ 0 ..2 ] of Byte ;
end ;
function PtrToStr(P: Pointer ) : string ;
const
HexChar: array [ 0 ..15 ] of Char = "0123456789ABCDEF" ;
function HexByte(B: Byte ) : string ;
begin
Result:= HexChar[ B shr 4 ] + HexChar[ B and 15 ] ;
end ;
function HexWord(W: Word ) : string ;
begin
Result:= HexByte(Hi (W) ) + HexByte(Lo (W) ) ;
end ;
begin
Result:= HexWord(HiWord(LongInt (P) ) ) + ":" + HexWord(LoWord(LongInt (P) ) ) ;
end ;
procedure Display(X: array of const ) ;
I: Integer ;
begin
for I:= 0 to High (X) do
with TVarRec(X[ I] ) , Data do
begin
case Tag of
0 : ShowMessage("Integer: " + IntToStr (L) ) ;
1 : if B then
ShowMessage("Boolean: True" )
else
ShowMessage("Boolean: False" ) ;
2 : ShowMessage("Char: " + C) ;
3 : ShowMessage("Float: " + FloatToStr (E^) ) ;
4 : ShowMessage("String: " + S^) ;
5 : ShowMessage("Pointer: " + PtrToStr(P) ) ;
6 : ShowMessage("PChar: " + StrPas (X) ) ;
7 : ShowMessage("Object: " + O.ClassName ) ;
end ;
end ;
end ;
procedure TForm1.Button1Click (Sender: TObject ) ;
P: array [ 0 ..5 ] of Char ;
begin
P:= "Привет" #0 ;
Display([ -12345678 , True , "A" , 1.2345 , "ABC" , Ptr ($1234 , $5678 ) , P,
Form1] ) ;
end ;
Массив констант (array of const) фактически является открытым массивом TVarRec (описание предекларированных типов Delphi вы можете найти в электронной справке). Приведенный ниже "псевдокод" на языке Object Pascal может послужить скелетом для дальнейшего развития:
procedure AddStuff(const A: array of const ) ;
var i: Integer ;
begin
for i:= Low (A) to High (A) do
with A[ i] do
case VType of
begin
{ добавляем натуральное число, все real-форматы
Автоматически приводятся к extended }
end ;
begin
{ добавляем целое число, все integer-форматы
Автоматически приводятся к LongInt }
end ;
begin
if VObject is DArray then
with DArray(VObject) do
begin
{ добавляем массив double-типа }
else if VObject is IArray then
with IArray(VObject) do
begin
{ добавляем массив integer-типа }
end ;
end ;
end ; { Case }
end ; { AddStuff }
Для получения дополнительной информации загляните в главу "open arrays" электронной справки.
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba
Массив констант во время выполнения приложения
Автор: Peter Below
...хорошо, непосредственно это синтаксис не поддерживает, поскольку массив констант Array of Const подобен открытым массивам, главным образом в части характеристик времени компиляции. Но вы можете обойти этот неприятный момент, обладая хотя бы начальными знаниями того, как реализован открытый массив. Что нам для этого необходимо: динамически размещенный массив array of TVarRec, который "принимает" ваши параметры, и "псевдоним" (alias) функции Format, позволяющий работать с таким массивом без "ругани" со стороны компилятора.
type
{ объявляем тип для динамического массива array of TVarRecs }
TVarArray = array [ 0 ..High (Word ) div Sizeof (TVarRec) - 1 ] of TVarRec;
PVarArray = ^TVarArray;
{ Объявляем alias-тип для функции Format. Передаваемые параметры будут иметь
В стеке тот же самый порядок вызова, что и при нормальном вызове Format }
FormatProxy = function (const aFormatStr: string ; var aVarRec: TVarRec;
HighIndex: Integer ) : string ;
{ AddVarRecs копирует параметры, передаваемые в массиве A в pRecs^, начиная
С pRecs^. highIndex - самый большой доступный индекс pRecs, число
Распределенных элементов - 1. }
procedure AddVarRecs(pRecs: PVarArray; atIndex, highIndex: Integer ; const A:
array of const ) ;
I: Integer ;
begin
if pRecs <> nil then
for i:= 0 to High (A) do
begin
if atIndex <= highIndex then
begin
PRecs^[ atIndex] := A[ i] ;
Inc (atIndex) ;
end { If }
else
Break ;
end ; { For }
end ; { AddVarRecs }
procedure TScratchMain.SpeedButton2Click (Sender: TObject ) ;
S: string ;
Proxy: FormatProxy;
begin
{ распределяем массив для четырех параметров, индексы - 0..3 }
GetMem (p, 4 * Sizeof (TVarRec) ) ;
{ добавляем параметры последующими вызовами AddVarRecs }
AddVarRecs(p, 0 , 3 , [ 12 , 0.5 , "Шаблон" ] ) ;
AddVarRecs(p, 3 , 3 , [ "Тест" ] ) ;
{ получаем полномочия Format }
@Proxy:= @SysUtils.Format ;
{ Вызов с динамически сгенерированным массивом параметров.
Естественно, строка формата может также быть сформирована
И во время выполнения программы. }
S:= Proxy("Целое: %d, Реальное: %4.2f, Строки: %s, %s" , p^[ 0 ] , 3 ) ;
{ выводим результат }
ShowMessage(S) ;
finally
FreeMem (p, 4 * Sizeof (TVarRec) ) ;
end ;
end ;
Я надеюсь вы поняли принцип. Естественно, имеются ограничения. Вы можете передавать в AddVarRecs числовые величины, строковые переменные и литералы, но не в коем случае не строковые выражения! В этом случае компилятор должен для хранения результата сформировать в стеке временную строку, передать ее в AddVarRecs (или лучше по адресу в TVarRec), и она может прекратить свое существование или может быть перезаписана в стеке другими данными, если в конечном счете вы передадите в Proxy целый массив!
Тестировалось только в Delphi 1.0!