読者です 読者をやめる 読者になる 読者になる

chokudaiサーチのメモ

CODEVS 5で話題になったchokudaiサーチのリンク集 正式名は beam stack search だとか

[追記] 診断人さん(@nico_shindannin)の調査によると、2つはアルゴリズムも目的も違うものであるとの指摘

shindannin.hatenadiary.com

Beam stack search - Wikipedia]

www.slideshare.net

説明

ソース公開までのツイート twilog.org

ちょくだいさんマジイケメン

競プロメモ 2016.01.29 Fri

デバッグ用

cerr << "debug" << endl // デバッグ用 消さなくてAtCoderではAC

vector を全列挙

// > 4 3 1 1 2 10 2 
void Print(const vector<ll> &v) {
    cerr << "> ";
    for (int i = 0; i < v.size(); i++) {
        cerr << v[i] << " ";
    }
    cerr << endl;
}

vector の要素にxがあるか

if (find(v.begin(), v.end(), x) != v.end()){
        cout << "あり" << endl;
}else{
        cout << "なし" << endl;
}

文字列の置換

using namespace std;
string Replace(string s1, string s2, string s3)
{
    string::size_type  Pos(s1.find(s2));
    while (Pos != string::npos) {
        s1.replace(Pos, s2.length(), s3);
        Pos = s1.find(s2, Pos + s3.length());
    }
    return s1;
}

int main() {
    string str = "abcdefg";
    str = Replace(str, "cd", "XX");
    return 0;
}

浮動小数点型の出力

cout では出力桁が小さいのでprintf()で桁数を指定する

    double t = 0.1234567890;
    cout << t << endl;
    printf("%.10f\n",t);
0.123457
0.1234567890

切り上げ 切り下げ

 double d = 1.2345;
    cout << "切り上げ " << ceil(d) << endl;
    cout << "切り下げ " << floor(d) << endl;

はてなブログでコードのフォントを小さくする

「デザイン」→「カスタマイズ」→「デザインCSS」に以下を追加

pre.code{
   font-size: 60%
}

Linux Mint をインストールした時のメモ

bootable USB

tacatakatca.hatenablog.com

SandS

qiita.com

システム:日本語 ディレクトリ:英語

日本語でインストール
設定から英語にして再起動
ディレクトリ名を英語にして設定を日本語にして再起動
ディレクトリ名を英語のままにする    

サウンド

構成
ASUS H170 PRO GAMING
Linux Mint 17.3 Cinnamon 64-bit
症状
音がでない
「サウンド」の「サウンドの出力先」が空欄

sudo apt-add-repository ppa:ubuntu-audio-dev/alsa-daily
sudo apt-get update 
sudo apt-get install oem-audio-hda-daily-lts-vivid-dkms

Python文法詳解の読書メモ

http://fmhr.github.io/2015/02/19/Python%E6%96%87%E6%B3%95%E8%A9%B3%E8%A7%A3/

↑からこっちにコピペ

title: Python文法詳解 date: 2015-02-19 01:53:11

tags:

読みながらとった復習用メモ(ほとんど目次)

Python文法読解

石本 敦夫

第1章 イントロダクション

1.1 Python の特徴

手続き型言語 オブジェクト指向プログラミング 動的型システム インタープリタ オープンソース

1.1.1 読みやすさ

1.1.2 シンプル

1.1.3 高レベル言語

1.1.4 Batterise included

1.1.5 マルチプラットホーム

1.1.6 拡張と組み込み

1.2 Python の歴史

1.3 Monty Python's Flying Circus

1.4 Python の処理系

第2章 Pythonの実行

2.1 Python を実行してみる

2.1.1 Pythonスクリプトの実行

対話コンソールでは、最後に評価した計算結果が、_という名前の変数に保存されます。

2.1.2 Pythonスクリプトファイル

2.1.3 スクリプトファイルの文字コード

2.1.4 Pythonスクリプトの構造

2.1.4.1 インデントによるブロック

2.2 基本データ型

0b 2進数 0o 8進数 0x 16進数

2.3 式と代入文

2.4 比較演算子

if (0<spam) and (spam < 100):
これを
if 0 < spam <100:
できる

2.5 辞書オブジェクト

2.6 リストとタプル

2.7 シーケンスのアクセス

文字列やリスト、タプルなどの配列は、Pythonではシーケンスと呼ばれ、どの種類のオブジェクトでも、同じ方法で要素にアクセスできます。

>>> S = 'abdeefg'
>>> S[0]
'a'
>>> S[1:4]
'bcd'
>>> S[:3]
'abc'

>>> L = [0, 1, 2, 3, 4, 5]
>>> L = [0] = 'spam'
>>> L
['spam', 1, 2, 3, 4, 5]
>>> L[0:3] = ['ham', 'egg']
>>> L
['ham', 'egg', 4, 5]

2.8 if ... elif ... else 文

2.9 ループ

break

continue

else節

whileループとforループには、else節を指定できます。else節は、ループが正常に終了した場合にのみ実行され、break文でループを中断した場合には実行されません。

2.10 イテラブルオブジェクト

イテレータ

2.11 関数

2.12 クラス

2.13 モジュール

2.14 入出力

第3章 式とデータ型

3.1 Pythonのデータ型

数値型:整数型・浮動小数点数型・bool型など シーケンス(配列):リスト・タプル・文字列・バイトなど

3.2 Pythonのオブジェクト

3.2.1 オブジェクトのメソッドと属性

3.3 Noneオブジェクト

オブジェクトがNoneオブジェクトであることをチェックする特 spam is None のように == ではなく is, is not 演算子を使う。これは == よりも is のほうが高速に動作し、 ==演算子では必ずしも正しく判定できるとは限らないから。

3.4 Ellipsisオブジェクト

3.5 関数の呼び出し

キーワード引数 spam(spam=1, ham=1)

引数をリストなどのイテラブルオブジェクトに格納して、

args = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
spam(*args)

とできます。このように、引数に *記号をつけて関数を呼び出すと、その因数は呼び出し時に展開され、先頭の要素から順に引数として指定されます。 また、辞書などのマッピングオブジェクトを、 **記号をつけて引数に指定すると、呼び出し時にすべての要素を、キーを引数名、値を引数値としたキーワード引数として、展開します。

3.6 代入文

spam = ham = egg = 100

3.6.1 変数と参照

2つの参照先になっている1つのオブジェクト リストに値を追加:オブジェクトは1つのまま 整数の加算 :新しいオブジェクトが作成される

3.6.2 要素の分解

代入文の左辺に、複数の変数を感まで区切って指定するとイテラブルオブジェクトの要素を分解して代入できます

>>> spam = [1, 2, 3]
>>> a, b, c = spam
>>> a, b, c
(1, 2, 3)

左辺の変数の数より、右辺の要素の数が多い場合、左辺に*記号をつけた変数名があれば、右辺の要素のうち代入先のない要素は1つのリストオブジェクトとしてまとめられて、その変数に代入されます。

>>> spam, ham, *egg = 1, 2, 3, 4, 5
>>> spam, ham, egg
1, 2, [3, 4, 5]

>>> spam, *ham, egg = 1, 2, 3, 4, 5
>>> spam, ham, egg
1, [2, 3, 4], 5

>>> *spam, ham, egg = 1, 2, 3, 4, 5
>>> spam, ham, egg
[1, 2, 3], 4, 5

右辺の要素の数が足りない場合、*記号のついた変数は、要素の数が0の、空のリストとなります。

>>> spam, ham, egg = 1, 2
ValueError: need more than 2 values to unpack

>>> spam, ham, *egg = 1, 2
>>> spam, ham, egg
1, 2, []

3.6.3 del文

3.6.4 累算代入文

代入文 意味
+= 加算
-= 減算
*= 乗算
/= 除算
//= 整数除算
%= 剰余
**= 累乗
>>= 右シフト
<<= 左シフト
&= ビット毎の論理積
^= ビット毎の排他的論理積
l= ビット毎の論理和

3.7 変数名

ソースコード上に喜寿治した変数名がそのまま使われるのではなく、Unicode標準で定められた正規化形式 (NFLC)に正規化されます。(ア(全角)→ア(半角), A(全角)→A(アスキー文字), 1(全角)→1(アスキー文字))

3.8 演算子

3.8.1 算術演算子

3.8.2 論理演算子

x or y : 真の値を返します。両方が真の時xの値を返します。両方が偽のとき、yの値を返します。 x and y : 偽の値を返します。両方が真の時yの値を返します。両方が偽のとき、xの値を返します。 not x : 真ならbool型のFalse 偽ならbool型のTrueを返します。

3.8.3 比較演算子

3.8.4 条件演算子(3項演算子)

a if b else c 条件式bの値が真ならa, 偽ならcが値となる。

>>> x = 1
>>> 100 if x == 1 else 200
100
>>> 100 if x == 2 else 200
200

x is y else z はand演算子とor演算子の組み合わせで書き直せる。 x and y or z

3.9 数値型

3.9.1 数値型の算術演算子

3.9.2 除算と整数除算

3.9.3 自動型変換

3.9.4 その他の演算

abs(x) 数値の絶対数を返す divmod(x, y) xをyで除算した商と余りをタプルで返す pow(x, y) x y の高速版 pow(x, y, z) (x y) % z の高速版

3.9.5 数値型のメソッドと属性

3.10 整数

Pythonの整数型には値の範囲に制限がなく、システムメモリ容量が赦す限り、どんな大きな値の整数オブジェクトでも作成できます

3.10.1 int型

3.11 理論値

3.11.1 bool型

True 0以外の整数、空ではないオブジェクト False 0, 空のオブジェクト

3.12 整数のビット操作

演算 意味
x|y 論理和
x^y 排他的論理和
x&y 論理積
~x xのビット毎の反転
x << y xをyビット左にシフト
x >> y 右にシフト

3.12.1 負の整数のビット操作

3.12.2 ビット反転演算子 ~

Pythonのビット反転演算子は、内部的にはビット演算を行わずに、xを2の補数形式として全てのビットを反転させた値で、~演算子を2回続けて適用すると、元の値に戻るようになっている

>>> ~5
-6
>>> ~(-6)
5

3.12.3 シフト演算子

正負の符号が変わらないように符号ビットを拡張しながら、ビットパターンを左右にシフトします

3.13 浮動小数点数

3.13.1 float型

3.13.2 infとnan

inf infinity 無限大 nan Not A Namber 非数

3.13.3 不動小点数のメソッド

3.14 複素数

3.14.1 complex型

3.15 10進浮動小数点数

第4章 シーケンスとコンテナ型

4.1 シーケンス

Pythonでは、一般に配列と呼ばれる順序付きのコレクションを、シーケンスと呼ぶ。 リスト型、タプル型、文字列型、バイト型など

4.1.1 添字によるアクセス

4.1.2 スライス

シーケンス[開始位置:終了位置:増分値] 増分値をマイナスにすると逆順になる L[::-1] ≒ reversed(L)

4.1.2.1 スライスオブジェクト

L[slice(1,10,3)]

4.1.3 シーケンス要素の代入文

4.1.3.1 スライスを指定した代入文
4.1.3.2 累算代入文

L[3:5] += ['spam', 'ham'] L[3:5] *= 2

4.1.5 シーケンスの演算子

4.1.5.1 算術演算子

[1, 2] + [3, 4] [1, 2] * 3

4.1.5.2 比較演算子

[1, 2] < [3, 4]

4.1.5.3 メンバーシップ演算子
>>>'B' in ['A', 'B', 'C']
True
4.1.5.4 シーケンスの長さ

len()

4.2 リスト

シーケンスオブジェクト

4.2.1 リストの要素

4.2.2 リスト内包

[式 for 変数名 in イテラブルオブジェクト] [式 for 変数名 in イテラブルオブジェクト if 条件式]

4.2.3 リストの演算子

[[], [], []] (誤) [[]] * 3
(正) [[] for _ in range(3)]

4.2.3.5 累算代入文

4.2.4 list型

4.2.5 リストのメソッド

Pythonで使われるソートアルゴリズムは安定ソートで、ソートのキーが等しい要素同士は、
ソートの前後(時)で前後関係(位置)は変わらない

4.3 タプル

更新不能なリスト

4.3.1 タプルの演算子

4.3.2 tuple型

4.3.3 タプルのメソッド

4.3.4 リストとタプル

更新不能なシーケンスのメリットに、辞書のキーや集合の要素として使用できる点がある タプルは複数の要素から構成される値を表現する場合に使用される (user_name, first_name, family_neme) 定義のない構造体に近い タプルは固定長シーケンスなので、リストよりもメモリの利用効率が良い

4.4 文字列型とバイト型

エンコーディング名を指定するとき、大文字・小文字の違いは無視される スペース、ハイフン、アンダースコアは同一視される

4.5 文字列

Pythonの文字列はUnicode文字のシーケンス

 >>> s = 'とても
        ながい
        文字列'
 >>> print(s)
 とてもながい文字列

 >>> s = '''とても
        ながい
        文字列'''
 >>> print(s)
 とても
 ながい
 文字列

4.5.1 エスケープシーケンス

4.5.2 raw文字列

4.5.3 str型

4.5.4 文字列の演算子

4.5.4.1 書式化演算子

4.5.5 文字の列挙

4.5.5 文字の列挙

>>> for c in 'abc':
...     print(c)
... 
a
b
c

>>> x, y, z = 'abc'
>>> print(x, y, z)
a b c
>>> 

4.5.6 文字列のメソッド

str.capitalize() 文字列の最初の文字だけ大文字、残りを小文字にする(Spam)

str.casefold() 全て小文字にする

str.center(width[, fillchar]) str.count(sub[, start[, end]]) str.encode(encoding='utf-8', errors='strict') str.endswith(suffix[, start[, end]]) str.expandtabs([tabsize]) str.find(sub[, start[, end]]) str.format(*args, **lwargs) str.format_map(mapping) str.index(sub[, start[, end]]) str.isalnum() str.isalpha() str.isdecimal() str.isdigit() str.isidentifier() str.islower() str.isnumeric() str.ispriontable() str.isspace() str.istitle() str.isupper() str.join(iterable) str.ljust(width[, fillchar]) str.lower() str.lstrip([chars]) str.maketrans(x[, y[, z]]) str.partition(sep) str.replace(old, new[, count]) str.rfined(sub[, start[, end]]) str.rindex(sub[, start[, end]]) str.rjust(width[, fillchar]) str.rpartition(sep) str.rsplit(sep=None, maxsplit=-1) str.rstrip([chars]) str.split(sep=None, maxsplit=-1) str.splitlines([keepends]) str.startwith(prefix[, startp, end]]) str.strip([chars]) str.swapcase() str.title() str.translate(map) str.upper() str.zfill(width)

4.5.7 format()メソッドのフォーマット指定文文字列

4.5.7.1 フィールド名
4.5.7.2 文字列化指定フラグ

4.6 バイト列

4.6.1 bytes型

4.6.2 バイト列の演算子

4.6.3 バイト値の列挙

4.6.4 バイト列のメソッド

4.7 bytearray型

4.7.1 bytearrayのメソッド

4.8 辞書オブジェクト

連想配列とも呼ばれる Pythonでは、辞書オブジェクトのような、キーとその値を登録するデータ型を。マッピング型と呼ぶ タプルをキーにすることができる

rgbs = {(255,0,0):'red', (0,255,0):'greeen', (0,0,255):'blue'}

4.8.1 要素の操作

4.8.2 辞書のキー

Pythonの辞書はハッシュテーブルとして実装されている ハッシュテーブルはキーからハッシュ値を生成し、高速なデータ管理を行う キーの値が変更されるとハッシュ値が変更されてしまうので、キーは変更できない これをハッシュ可能オブジェクトという 例外:ハッシュ値が変更されなければいいので、クラスのインタンスなどはキーになれる

4.8.3 辞書内包

{key:value for 変数名 in イテラブルオブジェクト}

4.8.4 辞書の演算子

in not in

4.8.5 dict型

4.8.6 要素の列挙とビューオブジェクト

辞書の順番は一定ではない

4.8.6.1 ビューオブジェクト

4.8.7 辞書のメソッド

4.9 集合オブジェクト

集合は、同じ値の要素は1つだけしか登録できない、という性質のコレクション {要素, 要素, 要素, 要素,... }

4.9.1 集合内包

{式 for 変数名 in イテラブルオブジェクト}

4.9.2 要素の列挙

4.9.3 集合の演算子

4.9.3.1 比較演算子

4.9.3.2 算術演算子・ビット演算子

4.9.3.3 累算代入文

4.9.4 set型

4.9.5 集合のメソッド

4.9.6 frozenset型

要素を作成後には追加・削除ができないオブジェクト ハッシュ化可能でキーになれる

第5章 ステートメント

5.1 if文

5.1.1 pass文

5.2 while文

5.2.1 break文

5.2.2 else節

while c:
    if c < 0:
        break
else:
    print('else') # breakされなかった場合のみに実行される

5.3 for文

変数名の戦闘に をつけて変数名と指定すると、複数の要素をリストに格納して、1つの変数で受け取るようにできる`

>>> L = [(1, 2), (3, 4, 5), (6, 7, 8, 9)]
>>> for car, *cdr in L:
        print(car, cdr)

    1 [2]
    3 [4, 5]
    6 [7, 8, 9]

for文でもbreak文とelse節を使用できます

5.4 continue文

5.5 例外処理

5.5.1 例外型

5.5.2 raise文

5.5.3 例外の連結

5.5.4 トレースバックオブジェクト

5.3 assert文

assert文は実行時にデータや条件などの整合性をチェックし、問題がないことを確認するときに使用する

5.7 with文

ファイルオブジェクトへの書き込みを確実にファイルに反映するためには、必ずtry~finallyブロックを使って、open()したファイルをfile.close()する処理が必要です

fileobj = open(filename, 'w')
try:
    do_something(fileobj)
finally:
    fileobj.close()

with文はこのようなパターンを簡単に実装するためのブロックで、上の処理は次のようにかける

wit open(filename, 'w') as fileobj:
    do_something(fileobj)

このように、with文から初期化処理と終了処理を呼び出すインターフェースをもったオブジェクトを、コンテキストマネージャと呼ぶ. コンテキストマネージャには、fileオブジェクトや、socketオブジェクト、Lockオブジェクトなどがある

第6章 関数とクラス

6.1 関数定義

6.1.1 可変長引数

def spam(ham, egg, *args):
    pass

6.1.2 キーワード専用引数

因数に*記号をつけた後の引数はキーワード形式で値を指定しないとエラーになる

def spam(*ham, egg):
    pass
spam(1, egg=3)

6.1.3 デフォルト引数

def spam(ham, egg=1, bacon=2):
    pass
spam(1)

6.1.4 ドキュメンテーション文字列

6.1.5 関数アノテーション

def spam(ham:'hamの数', egg:dict, bacon:1 if ver > 1 else 2) -> int:
    pass
help(spam)

6.1.6 lambda式

f = lambda x, y, z=1: x+y*z
f(1,2)
3

6.2 モジュールとパッケージ

モジュール: .py パッケージ: ディレクトを使って階層的な構造を持つモジュール 拡張モジュール: C言語などで作成した共有ライブラリ

6.2.2 グローバル変数とローカル変数

spam = 100  # グローバル変数

def ham():
    egg = 200  # ローカル変数
    return egg + spam
spam = 100  # グローバル変数

def ham()
    global spam  # 宣言
    spam = 200  # グローバル変数

事前にグローバル変数がなくてもいい

def ham()
    global spam  # グローバル変数
    spam = 200

6.2.3 import文

6.2.4 モジュール検索パス

6.2.4.1 モジュール検索パスの設定

6.2.4.1 パス設定ファイル

6.2.5 パッケージ

ディレクトリに init.py というなめのファイルが有るディレクトリは、パッケージとしてインポートできる。 パッケージ内のサブディレクトリも、init.py ファイルがあればサブパッケージとしてインポートできる。 init.py ファイルは中身が空でもいい。

6.2.5.1 相対インポート

6.2.6 名前空間パッケージ

Python3.3 以降では init.py ファイルが存在しないディレクトリでも、パッケージとしてインポートできるようになった。

6.2.7 モジュールの実行

6.2.8 main モジュール

6.2.9 コンパイル済みモジュールファイル

6.3 名前空間とスコープ

名前空間: 名前と、名前が参照するオブジェクトの対応表 スコープ: 名前空間に登録されたオブジェクトの名前を、特別な指定なしに参照できる範囲

6.3.1 グローバル名前空間

6.3.2 ローカル名前空間

6.3.3 ローカルスコープのネスト(入れ子)

自由変数: 外側のローカル名前空間で定義されている変数 参照できる 束縛変数: スコープ内のローカル変数や引数 自由変数として参照している変数は、その変数を束縛した変数が終了した後でも、無効にはならない。(入れ子でnonlocalを使う)

6.3.4 名前空間の参照

6.3.5 文字列のintern

6.4 クラス

6.4.1 属性

6.4.2 インスタンスの作成と解放

new() メソッド

init() メソッド

del() メソッド

6.4.3 継承

6.4.3.1 多重継承

6.4.3.2 super()

6.4.3.3 クラスの定義エラー

MRO: Method Resolution Order メソッド解決順序

6.4.4 プリベートメンバ

class Spam:
    def __private(self):
        pass

6.4.5 クラスブロックとスコープ

6.4.6 インスタンスの名前空間

6.4.6.1 slots

6.4.7 メタプログラミング

6.4.7.1 メタクラスの名前空間

6.5 デコレータ

Pythonでは、「関数を因数として受け取り、戻り値として関数を返す」関数を、他の関数でラップした新しい関数 の作成や関数のフレームワークやサービスへの登録に利用できる。このような使い方をする関数を、 デコレータと呼びます。

6.5.1 ラッパ関数を作成するデコレータ

6.5.2 関数呼び出し形式のデコレータ

6.5.3 複数のデコレータ

6.5.4 functools.wrapsデコレータ

6.5.5 クラスデコレータ

第7章 データ型とプロトコル

7.1 ファイル入出力

7.1.1 テキストファイルの読み書き

7.1.2 バイナリファイルの読み書き

7.1.3 業単位の読み書き

7.1.4 標準入出力

7.1.4.1 print()関数

7.1.5 ファイルのクローズ

7.1.6 ファイルクラス

7.1.6.1 IOBaseクラス

7.2 オブジェクトの文字列表現

7.2.1 ascii()

7.2.2 文字列表現のカスタマイズ

7.2.3 対話コンソールでのrepr()

7.3 イテレータ

7.3.1 イテラブルなオブジェクト

7.3.2 リバースイテレータ

7.4 ジェネレータ

7.4.1 ジェネレータのメソッド

7.4.2 サブジェネレータ

7.4.3 ジェネレータ式

7.5 コンテキストマネージャ

7.5.1 contextilib.contextmanager()

7.6 ディスクリプタ

7.6.1 データディスクリプタと非データディスクリプタ

7.6.2 メソッドオブジェクト

7.6.3 classmethodとstaticmethod

7.6.4 property

7.7 抽象規定クラス(ABC)

Dock typing "If it wolks like a duck and quacks like a duck, it must be a duck" Python2.6~/Python3.0~ Abstract Base Class(ABC)

7.7.1 abc.ABCMetaクラス

7.7.1.1 仮想サブクラス

7.7.2 抽象メソッド

7.8 特殊メソッド

7.8.1 二項演算子

7.8.2 単項演算子

7.8.3 比較演算子

7.8.4 累算代入文

7.8.5 数値変換

7.8.6 組み込み関数

7.8.7 インデックス値

7.8.8 ハッシュ値

7.8.9 文字列化・バイト列化

7.8.10 関数呼び出し

7.8.11 属性アクセス

第8章 tips

8.1 ガベージコレクション

Pythonのオブジェクトはすべて、自分を参照している変数をカウントしており、オブジェクトの参照がなくなり、 参照カウンタが0になると削除され、専有しているメモリなどのリソースを開放する

8.1.1 循環参照の検出

3世代にオブジェクトを分け、若い世代を頻繁に定期的に走査する

8.1.2 Python3.4以降のガレージコレクション

8.2 OSとUnicode

8.3 イントロスペクション

8.3.1 オブジェクトの型を所得する

8.3.2 オブジェクトのメンバを調べる

8.3.3 モジュールを探す

8.4 Pythonのバイトコード

おわり

Pythonメモ

http://fmhr.github.io/2015/02/14/Python-yukicoder149-151/

↑からこっちにコピペ

itertools.combinations(iter,y)

from itertools import combinations
for i in combinations(range(4),3):
    print(i)
(0, 1, 2)
(0, 1, 3)
(0, 2, 3)
(1, 2, 3)

set()

c = (1,2,3)
m =  (0,1,2,3,4,5,6,7)
if set(c) < set(m):
    print('in')
else:
    print('not in')
in

リスト内包記法

a = (3,5,1)
b = (1,1,1,1,1,1,1,1,1,1)
s = sum([b[i] for i in range(len(b)) if i in a]) 
print(s)
3

スライス

s = 'あいうえ'
print(len(s))
print(s[0:0+2])
4
あい

range()

for i in range(1,5,1):
    print(i)
1
2
3
4

リスト

a = [0, 1, 2]
print(a[-2])
print(a[-3])
print(a[-4])
1
0
Traceback (most recent call last):
  File "Untitled 7", line 4, in <module>
    print(a[-4])
IndexError: list index out of range