Javascript string split()

Splice ( )

Название этого метода похоже на slice( ): в таких похожих названиях разработчики часто путаются. Метод splice( ) добавляет и удаляет элементы из массива, меняя его. Давайте посмотрим, как добавлять и удалять элементы с помощью метода splice( ):

Удаление элементов

Чтобы удалить элементы, введите элемент, с которого нужно начать (index) и количество элементов, которые нужно удалить (number of elements):

array.splice(index, number of elements);

Параметр Index — это начальная точка удаления элементов. Элементы с порядковым номером меньше заданного параметра Index не будут удалены:

array.splice(2);  // Every element starting from index 2, will be removed

Если не указать второй параметр, все элементы от заданного параметра Index и до конца будут удалены:

only index 0 and 1 are still there

В качестве еще одно примера, я указал 1 в качестве второго параметра: таким образом, каждый раз при повторе метода splice ( ) будет удалять по одному элементу, начиная со второго:

array.splice(2, 1);

Массив до метода splice ( )

Splice ( ) применен один раз:

Элемент 3 удален: следовательно, теперь элемент “hello world” имеет порядковый номер 2

Splice ( ) применен два раза:

На этот раз, был удален элемент “hello world”, потому что его порядковый номер 2

Так можно продолжать до тех пор, пока не останется элементов с порядковым номером 2.

СинтаксисSyntax

Split(выражение, ])Split(expression, ]])

Синтаксис функции Split включает следующие :The Split function syntax has these :

ЧастьPart ОписаниеDescription
выражениеexpression Обязательная часть.Required. , содержащее подстроки и разделители. containing substrings and delimiters. Если аргумент expression является строкой нулевой длины («»), функция Split возвращает пустой массив — без элементов и данных.If expression is a zero-length string(«»), Split returns an empty array, that is, an array with no elements and no data.
delimiterdelimiter Необязательное свойство.Optional. Строковый символ, используемый для разделения подстрок.String character used to identify substring limits. Если этот аргумент не указан, в качестве разделителя используется знак пробела (» «).If omitted, the space character (» «) is assumed to be the delimiter. Если аргумент delimiter является строкой нулевой длины, возвращается массив с одним элементом, содержащим всю строку из аргумента expression.If delimiter is a zero-length string, a single-element array containing the entire expression string is returned.
ограничениеlimit Необязательное свойство.Optional. Количество возвращаемого подстройки; -1 указывает, что возвращаются все подстройки.Number of substrings to be returned; -1 indicates that all substrings are returned.
comparecompare Необязательно.Optional. Представляет собой числовое значение, указывающее вид сравнения, которое выполняется при оценке подстрок.Numeric value indicating the kind of comparison to use when evaluating substrings. Значения см. в разделе «Параметры».See Settings section for values.

JavaScript

JS Array
concat()
constructor
copyWithin()
entries()
every()
fill()
filter()
find()
findIndex()
forEach()
from()
includes()
indexOf()
isArray()
join()
keys()
length
lastIndexOf()
map()
pop()
prototype
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toString()
unshift()
valueOf()

JS Boolean
constructor
prototype
toString()
valueOf()

JS Classes
constructor()
extends
static
super

JS Date
constructor
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getUTCDate()
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMilliseconds()
getUTCMinutes()
getUTCMonth()
getUTCSeconds()
now()
parse()
prototype
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
toDateString()
toISOString()
toJSON()
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
toString()
toTimeString()
toUTCString()
UTC()
valueOf()

JS Error
name
message

JS Global
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()
eval()
Infinity
isFinite()
isNaN()
NaN
Number()
parseFloat()
parseInt()
String()
undefined
unescape()

JS JSON
parse()
stringify()

JS Math
abs()
acos()
acosh()
asin()
asinh()
atan()
atan2()
atanh()
cbrt()
ceil()
clz32()
cos()
cosh()
E
exp()
expm1()
floor()
fround()
LN2
LN10
log()
log10()
log1p()
log2()
LOG2E
LOG10E
max()
min()
PI
pow()
random()
round()
sign()
sin()
sqrt()
SQRT1_2
SQRT2
tan()
tanh()
trunc()

JS Number
constructor
isFinite()
isInteger()
isNaN()
isSafeInteger()
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
NaN
POSITIVE_INFINITY
prototype
toExponential()
toFixed()
toLocaleString()
toPrecision()
toString()
valueOf()

JS OperatorsJS RegExp
constructor
compile()
exec()
g
global
i
ignoreCase
lastIndex
m
multiline
n+
n*
n?
n{X}
n{X,Y}
n{X,}
n$
^n
?=n
?!n
source
test()
toString()

(x|y)
.
\w
\W
\d
\D
\s
\S
\b
\B
\0
\n
\f
\r
\t
\v
\xxx
\xdd
\uxxxx

JS Statements
break
class
continue
debugger
do…while
for
for…in
for…of
function
if…else
return
switch
throw
try…catch
var
while

JS String
charAt()
charCodeAt()
concat()
constructor
endsWith()
fromCharCode()
includes()
indexOf()
lastIndexOf()
length
localeCompare()
match()
prototype
repeat()
replace()
search()
slice()
split()
startsWith()
substr()
substring()
toLocaleLowerCase()
toLocaleUpperCase()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()

How to split a string by another string as delimiter:

/*
std::string split implementation by using delimeter as an another string
*/
std::vector<std::string> split(std::string stringToBeSplitted, std::string delimeter)
{
     std::vector<std::string> splittedString;
     int startIndex = 0;
     int  endIndex = 0;
     while( (endIndex = stringToBeSplitted.find(delimeter, startIndex)) < stringToBeSplitted.size() )
    {
       std::string val = stringToBeSplitted.substr(startIndex, endIndex - startIndex);
       splittedString.push_back(val);
       startIndex = endIndex + delimeter.size();
     }
     if(startIndex < stringToBeSplitted.size())
     {
       std::string val = stringToBeSplitted.substr(startIndex);
       splittedString.push_back(val);
     }
     return splittedString;
}

Complete executable code is as follows,

#include <string>
#include <vector>
#include <sstream>
#include <iostream>

/*
std::string split implementation by using delimeter as a character.
*/
std::vector<std::string> split(std::string strToSplit, char delimeter)
{
    std::stringstream ss(strToSplit);
    std::string item;
	std::vector<std::string> splittedStrings;
    while (std::getline(ss, item, delimeter))
	{
		splittedStrings.push_back(item);
    }
	return splittedStrings;
}

/*
std::string split implementation by using delimeter as an another string
*/
std::vector<std::string> split(std::string stringToBeSplitted, std::string delimeter)
{
	std::vector<std::string> splittedString;
	int startIndex = 0;
	int  endIndex = 0;
	while( (endIndex = stringToBeSplitted.find(delimeter, startIndex)) < stringToBeSplitted.size() )
	{

		std::string val = stringToBeSplitted.substr(startIndex, endIndex - startIndex);
		splittedString.push_back(val);
		startIndex = endIndex + delimeter.size();

	}
	if(startIndex < stringToBeSplitted.size())
	{
		std::string val = stringToBeSplitted.substr(startIndex);
		splittedString.push_back(val);
	}
	return splittedString;

}

int main()
{
	std::string str = "Lets split this line using split functions";

	// Spliting the string by ''
	std::vector<std::string> splittedStrings = split(str, ' ');
	for(int i = 0; i < splittedStrings.size() ; i++)
		std::cout<<splittedStrings<<std::endl;

	// Spliting the string by an another std::string
	std::vector<std::string> splittedStrings_2 = split(str, "split");
	for(int i = 0; i < splittedStrings_2.size() ; i++)
		std::cout<<splittedStrings_2<<std::endl;	

	return 0;

}

Методы String.IndexOf и String.SubstringString.IndexOf and String.Substring methods

Если вам нужны все подстроки в строке, можете использовать один из методов сравнения строк, которые возвращают индекс начала сопоставления.If you aren’t interested in all of the substrings in a string, you might prefer to work with one of the string comparison methods that returns the index at which the match begins. Затем для извлечения нужных подстрок можно будет вызвать метод Substring.You can then call the Substring method to extract the substring that you want. К методам сравнения строк можно отнести:The string comparison methods include:

  • IndexOf, возвращающий отсчитываемый от нуля индекс первого появления символа или строки в экземпляре строки.IndexOf, which returns the zero-based index of the first occurrence of a character or string in a string instance.

  • IndexOfAny, возвращающий отсчитываемый от нуля индекс в текущем экземпляре строки первого появления любого символа в массиве символов.IndexOfAny, which returns the zero-based index in the current string instance of the first occurrence of any character in a character array.

  • LastIndexOf, возвращающий отсчитываемый от нуля индекс последнего появления символа или строки в экземпляре строки.LastIndexOf, which returns the zero-based index of the last occurrence of a character or string in a string instance.

  • LastIndexOfAny, возвращающий отсчитываемый от нуля индекс в текущем экземпляре строки последнего вхождения любого символа в массиве символов.LastIndexOfAny, which returns a zero-based index in the current string instance of the last occurrence of any character in a character array.

В следующем примере метод IndexOf используется для поиска точек в строке.The following example uses the IndexOf method to find the periods in a string. После чего в нем используется метод Substring для возврата полных предложений.It then uses the Substring method to return full sentences.

How to Split a std::string using a char as delimiter:

In this we will convert the passed string into a stringstream and from that string stream we will fetch each word using getline method,

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
/*
std::string split implementation by using delimiter as a character.
*/
std::vector<std::string> split(std::string strToSplit, char delimeter)
{
    std::stringstream ss(strToSplit);
    std::string item;
    std::vector<std::string> splittedStrings;
    while (std::getline(ss, item, delimeter))
    {
       splittedStrings.push_back(item);
    }
    return splittedStrings;
}

like if first string is “Lets split this line using split functions” then on splitting it with “split” delimiter the result should be,

“Lets”

“this line using”

“functions”

To achieve this we have to write an another split function with std::string as delimiter i.e.

SYNTAXSYNTAX

На следующей схеме показан синтаксис оператора-split.The following diagram shows the syntax for the -split operator.

Имена параметров не отображаются в команде.The parameter names do not appear in the command. Включайте только значения параметров.Include only the parameter values. Значения должны присутствовать в порядке, указанном в схеме синтаксиса.The values must appear in the order specified in the syntax diagram.

Можно заменить или для в любой инструкции двоичного разделения (оператор разбиения, включающий разделитель или блок сценария).You can substitute or for in any binary Split statement (a Split statement that includes a delimiter or script block). В операторах и регистр не учитывается.The and operators are case-insensitive. В операторе учитывается регистр, что означает, что при применении правил разделителей учитывается регистр.The operator is case-sensitive, meaning that case is considered when the delimiter rules are applied.

Класс StringTokenizer

И еще несколько самых частых сценариев работы со строками. Как разбить строку на несколько частей? Для этого есть несколько способов.

Метод

Первый способ разбить строку на несколько частей — использовать метод . В него в качестве параметра нужно передать регулярное выражение: специальный шаблон строки-разделителя. Что такое регулярное выражение, вы узнаете в квесте Java Multithreading.

Пример:

Код Результат
Результатом будет массив из трех строк:

Просто, но иногда такой подход избыточен. Если разделителей много, например, «пробел», «enter», «таб», «точка», приходится конструировать достаточно сложное регулярное выражение. Его сложно читать, а значит, в него сложно вносить изменения.

Класс

В Java есть специальный класс, вся работа которого — разделять строку на подстроки.

Этот класс не использует регулярные выражения: вместо этого в него просто передается строка, состоящая из символов-разделителей. Преимущества этого подхода в том, что он не разбивает сразу всю строку на кусочки, а потихоньку идет от начала к концу.

Класс состоит из конструктора и двух методов. В конструктор нужно передать строку, которую мы разбиваем на части, и строку — набор символов, используемых для разделения.

Методы Описание
Возвращает следующую подстроку
Проверяет, есть ли еще подстроки.

Этот класс чем-то напоминает класс , у которого тоже были методы и .

Создать объект можно командой:

Где строка — это , которую будем делить на части. А — это строка, каждый символ которой считается символом-разделителем. Пример:

Код Вывод на экран

Обратите внимание, что разделителем считается каждый символ строки, переданный второй строкой в конструктор

Специфичные для потока данные

Некоторые ресурсы должны быть заблокированы, чтобы их могли использовать сразу несколько потоков. А другие должны быть защищены от просмотра в потоках, которые не «владеют» ими. Функция local() создает объект, способный скрывать значения для отдельных потоков.

import random
import threading
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-10s) %(message)s',
                    )

def show_value(data):
    try:
        val = data.value
    except AttributeError:
        logging.debug('No value yet')
    else:
        logging.debug('value=%s', val)


def worker(data):
    show_value(data)
    data.value = random.randint(1, 100)
    show_value(data)

local_data = threading.local()
show_value(local_data)
local_data.value = 1000
show_value(local_data)

for i in range(2):
    t = threading.Thread(target=worker, args=(local_data,))
    t.start()

Обратите внимание, что значение local_data.value не доступно ни для одного потока, пока не будет установлено

$ python threading_local.py

(MainThread) No value yet
(MainThread) value=1000
(Thread-1  ) No value yet
(Thread-1  ) value=34
(Thread-2  ) No value yet
(Thread-2  ) value=7

Чтобы все потоки начинались с одного и того же значения, используйте подкласс и установите атрибуты с помощью метода __init __() .

import random
import threading
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-10s) %(message)s',
                    )


def show_value(data):
    try:
        val = data.value
    except AttributeError:
        logging.debug('No value yet')
    else:
        logging.debug('value=%s', val)

def worker(data):
    show_value(data)
    data.value = random.randint(1, 100)
    show_value(data)

class MyLocal(threading.local):
    def __init__(self, value):
        logging.debug('Initializing %r', self)
        self.value = value

local_data = MyLocal(1000)
show_value(local_data)

for i in range(2):
    t = threading.Thread(target=worker, args=(local_data,))
    t.start()

__init __() вызывается для каждого объекта (обратите внимание на значение id()) один раз в каждом потоке

$ python threading_local_defaults.py

(MainThread) Initializing <__main__.MyLocal object at 0x100514390>
(MainThread) value=1000
(Thread-1  ) Initializing <__main__.MyLocal object at 0x100514390>
(Thread-1  ) value=1000
(Thread-2  ) Initializing <__main__.MyLocal object at 0x100514390>
(Thread-1  ) value=81
(Thread-2  ) value=1000
(Thread-2  ) value=54

Данная публикация является переводом статьи «threading – Manage concurrent threads» , подготовленная редакцией проекта.

Расширенные строковые функции Python

encode() Используется для возврата закодированных строк str_name.encode (кодировка = кодировка, ошибки = ошибки)
expandtabs() Для установки или исправления пробелов табуляции между символами или алфавитами str_name.expandtabs (размер табуляции)
format() Заменяет имя переменной, записанное в {}, значением при выполнении str_name.format (значение1, значение2 …)
format_map() Для форматирования заданной строки и возвращается str_name.format_map (отображение)
isidentifier() Проверяет, являются ли символы буквенно-цифровыми буквами (az) и (0-9) или подчеркиванием (_), и возвращает True str_name.isidentifier()
isprintable() Проверяет, все ли символы доступны для печати, затем возвращает True str_name.isprintable()
istitle() Проверяет, все ли начальные символы слов в верхнем регистре, затем возвращает True str_name.istitle()
join() Принимает слова как повторяемые и объединяет их в строку str_name.join (повторяемый)
ljust() Возвращает выровненную по левому краю строку с минимальным значением, заданным как ширина str_name.ljust (длина, символ)
lstrip() Удаляет символы с левого края на основе данного аргумента str_name.lstrip (символы)
maketrans() Создает сопоставленную таблицу, используемую для переводов. str_name.maketrans (x, y, z)
rsplit() Используется для разделения строки с правого конца str_name.rsplit (разделитель, maxsplit)
rfind() Ищет указанное значение и находит позицию его последнего значения. str_name.rfind (значение, начало, конец)
rindex() Ищет указанное значение и находит позицию его последнего значения. str_name.rindex (значение, начало, конец)
rjust() Возвращает выровненную по правому краю строку с минимальным значением, заданным как ширина str_name.rjust (длина, символ)
rpartition() Ищет последнее вхождение указанной строки и разбивает строку на кортеж из трех элементов. str_name.rpartition (значение)
rstrip() Удаляет символы с правого конца на основе заданного аргумента str_name.rstrip (символы)
translate() Используется для получения переведенной строки str_name.translate (таблица)
zfill() Он возвращает новую строку с символами «0», добавленными слева в строке. str_name.zfill (len)

Узнайте, какие встроенные методы Python используются в строковых последовательностях

Строка — это последовательность символов. Встроенный строковый класс в Python представлен строками, использующими универсальный набор символов Unicode. Строки реализуют часто встречающуюся последовательность операций в Python наряду с некоторыми дополнительными методами, которые больше нигде не встречаются. На картинке ниже показаны все эти методы:

Встроенные строковые функции в Python

Давайте узнаем, какие используются чаще всего

Важно заметить, что все строковые методы всегда возвращают новые значения, не меняя исходную строку и не производя с ней никаких действий

Код для этой статьи можно взять из соответствующего репозитория Github Repository.

1. center( )

Метод выравнивает строку по центру. Выравнивание выполняется с помощью заданного символа (пробела по умолчанию).

Синтаксис

, где:

  • length — это длина строки
  • fillchar—это символ, задающий выравнивание

Пример

2. count( )

Метод возвращает счёт или число появлений в строке конкретного значения.

Синтаксис

, где:

  • value — это подстрока, которая должна быть найдена в строке
  • start — это начальное значение индекса в строке, где начинается поиск заданного значения
  • end — это конечное значение индекса в строке, где завершается поиск заданного значения

Пример

3. find( )

Метод возвращает наименьшее значение индекса конкретной подстроки в строке. Если подстрока не найдена, возвращается -1.

Синтаксис

, где:

  • value или подстрока, которая должна быть найдена в строке
  • start — это начальное значение индекса в строке, где начинается поиск заданного значения
  • end — это конечное значение индекса в строке, где завершается поиск заданного значения

Пример

Метод возвращает копию строки, преобразуя все заглавные буквы в строчные, и наоборот. 

Синтаксис

Пример

5. startswith( ) and endswith( )

Метод возвращает True, если строка начинается с заданного значения. В противном случае возвращает False.

С другой стороны, функция возвращает True, если строка заканчивается заданным значением. В противном случае возвращает False.

Синтаксис

  • value — это искомая строка в строке
  • start — это начальное значение индекса в строке, где начинается поиск заданного значения
  • end — это конечное значение индекса в строке, где завершается поиск заданного значения

Пример

6. split( )

Метод возвращает список слов в строке, где разделителем по умолчанию является пробел.

Синтаксис

  • sep: разделитель, используемый для разделения строки. Если не указано иное, разделителем по умолчанию является пробел
  • maxsplit: обозначает количество разделений. Значение по умолчанию -1, что значит «все случаи»

Пример

7. Строка заглавными буквами

Синтаксис

Синтаксис

Синтаксис

Пример

8. ljust( ) и rjust( )

С помощью заданного символа (по умолчанию пробел) метод возвращает вариант выбранной строки с левым выравниванием. Метод rjust() выравнивает строку вправо.

Синтаксис

  • length: длина строки, которая должна быть возвращена
  • character: символ для заполнения незанятого пространства, по умолчанию являющийся пробелом

Пример

9. strip( )

Метод возвращает копию строки без первых и последних символов. Эти отсутствующие символы — по умолчанию пробелы.

Синтаксис

character: набор символов для удаления

  • : удаляет символы с начала строки.
  • : удаляет символы с конца строки.

10. zfill( )

Метод zfill() добавляет нули в начале строки. Длина возвращаемой строки зависит от заданной ширины.

Синтаксис

width: указывает длину возвращаемой строки. Нули не добавляются, если параметр ширины меньше длины первоначальной строки.

Пример

Заключение

В статье мы рассмотрели лишь некоторые встроенные строковые методы в Python. Есть и другие, не менее важные методы, с которыми при желании можно ознакомиться в соответствующей документации Python.

  • PEG парсеры и Python
  • Популярные лайфхаки для Python
  • Овладей Python, создавая реальные приложения. Часть 1

Перевод статьи Parul PandeyUseful String Method

Удаление элементов

Чтобы удалить элементы, введите элемент, с которого нужно начать (index) и количество элементов, которые нужно удалить (number of elements):

array.splice(index, number of elements);

Параметр Index — это начальная точка удаления элементов. Элементы с порядковым номером меньше заданного параметра Index не будут удалены:

array.splice(2);  // Every element starting from index 2, will be removed

Если не указать второй параметр, все элементы от заданного параметра Index и до конца будут удалены:

only index 0 and 1 are still there

В качестве еще одно примера, я указал 1 в качестве второго параметра: таким образом, каждый раз при повторе метода splice ( ) будет удалять по одному элементу, начиная со второго:

array.splice(2, 1);

Массив до метода splice ( )

Splice ( ) применен один раз:

Элемент 3 удален: следовательно, теперь элемент “hello world” имеет порядковый номер 2

Splice ( ) применен два раза:

На этот раз, был удален элемент “hello world”, потому что его порядковый номер 2

Так можно продолжать до тех пор, пока не останется элементов с порядковым номером 2.

Итого

Шпаргалка по методам массива:

  • Для добавления/удаления элементов:

    • – добавляет элементы в конец,
    • – извлекает элемент с конца,
    • – извлекает элемент с начала,
    • – добавляет элементы в начало.
    • – начиная с индекса , удаляет элементов и вставляет .
    • – создаёт новый массив, копируя в него элементы с позиции до (не включая ).
    • – возвращает новый массив: копирует все члены текущего массива и добавляет к нему . Если какой-то из является массивом, тогда берутся его элементы.
  • Для поиска среди элементов:

    • – ищет , начиная с позиции , и возвращает его индекс или , если ничего не найдено.
    • – возвращает , если в массиве имеется элемент , в противном случае .
    • – фильтрует элементы через функцию и отдаёт первое/все значения, при прохождении которых через функцию возвращается .
    • похож на , но возвращает индекс вместо значения.
  • Для перебора элементов:

    forEach(func) – вызывает func для каждого элемента. Ничего не возвращает.

  • Для преобразования массива:

    • – создаёт новый массив из результатов вызова для каждого элемента.
    • – сортирует массив «на месте», а потом возвращает его.
    • – «на месте» меняет порядок следования элементов на противоположный и возвращает изменённый массив.
    • – преобразует строку в массив и обратно.
    • – вычисляет одно значение на основе всего массива, вызывая для каждого элемента и передавая промежуточный результат между вызовами.
  • Дополнительно:

    Array.isArray(arr) проверяет, является ли arr массивом.

Обратите внимание, что методы , и изменяют исходный массив. Изученных нами методов достаточно в 99% случаев, но существуют и другие

Изученных нами методов достаточно в 99% случаев, но существуют и другие.

  • arr.some(fn)/arr.every(fn) проверяет массив.

    Функция вызывается для каждого элемента массива аналогично . Если какие-либо/все результаты вызовов являются , то метод возвращает , иначе .

  • arr.fill(value, start, end) – заполняет массив повторяющимися , начиная с индекса до .

  • arr.copyWithin(target, start, end) – копирует свои элементы, начиная со и заканчивая , в собственную позицию (перезаписывает существующие).

Полный список есть в справочнике MDN.

На первый взгляд может показаться, что существует очень много разных методов, которые довольно сложно запомнить. Но это гораздо проще, чем кажется.

Внимательно изучите шпаргалку, представленную выше, а затем, чтобы попрактиковаться, решите задачи, предложенные в данной главе. Так вы получите необходимый опыт в правильном использовании методов массива.

Всякий раз, когда вам будет необходимо что-то сделать с массивом, а вы не знаете, как это сделать – приходите сюда, смотрите на таблицу и ищите правильный метод. Примеры помогут вам всё сделать правильно, и вскоре вы быстро запомните методы без особых усилий.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector