From 8ca54d8ea266b09f2a270065704d11708ad4c251 Mon Sep 17 00:00:00 2001 From: FuRuYa7 Date: Wed, 13 Apr 2022 17:28:15 +0900 Subject: [PATCH] Translated the "Description" of "Introduction to Python" into Japanese --- Translations/Delete-md-File.sh | 82 + Translations/README-ja.md | 79 + Translations/README.md | 81 + Translations/ja.patch | 2551 ++++++++++++++++++++++++++++++++ Translations/screenshot-ja.jpg | Bin 0 -> 70186 bytes 5 files changed, 2793 insertions(+) create mode 100644 Translations/Delete-md-File.sh create mode 100644 Translations/README-ja.md create mode 100644 Translations/README.md create mode 100644 Translations/ja.patch create mode 100644 Translations/screenshot-ja.jpg diff --git a/Translations/Delete-md-File.sh b/Translations/Delete-md-File.sh new file mode 100644 index 0000000..b27e915 --- /dev/null +++ b/Translations/Delete-md-File.sh @@ -0,0 +1,82 @@ +#!/bin/bash +echo +echo "----------------" +echo "Warning: The following files will be deleted by the script." +echo "Delete -> ~/PycharmProjects/'Introduction to Python'/----/task.md" +echo +read -p "Is it OK ? (y/N): " yn +case "$yn" in [yY]*) ;; *) echo "abort." ; exit ;; esac +echo +cd ~/PycharmProjects/'Introduction to Python'/ +rm 'Classes and objects/Class and Instance Variables/task.md' +rm 'Classes and objects/Definition/task.md' +rm 'Classes and objects/Special __init__ method/task.md' +rm 'Classes and objects/The self parameter/task.md' +rm 'Classes and objects/Update variable/task.md' +rm 'Classes and objects/Variable access/task.md' +rm 'Classes and objects/__str__ vs __repr__/task.md' +rm 'Condition expressions/Boolean operators order/task.md' +rm 'Condition expressions/Boolean operators/task.md' +rm 'Condition expressions/Else and elif parts in if statement/task.md' +rm 'Condition expressions/If statement/task.md' +rm 'Data structures/Dictionaries/task.md' +rm 'Data structures/Dictionary keys() and values()/task.md' +rm 'Data structures/In keyword/task.md' +rm 'Data structures/Join method/task.md' +rm 'Data structures/List items/task.md' +rm 'Data structures/Lists introduction/task.md' +rm 'Data structures/Lists operations/task.md' +rm 'Data structures/Nested Lists/task.md' +rm 'Data structures/Tuples/task.md' +rm 'File input output/Open file/task.md' +rm 'File input output/Read file/task.md' +rm 'File input output/What next/task.md' +rm 'File input output/Write to file/task.md' +rm 'Functions/Args and kwargs/task.md' +rm 'Functions/Default parameters/task.md' +rm 'Functions/Definition/task.md' +rm 'Functions/Keyword Arguments/task.md' +rm 'Functions/Parameters and call arguments/task.md' +rm 'Functions/Recursion/task.md' +rm 'Functions/Return value/task.md' +rm 'Introduction/About/task.md' +rm 'Introduction/Comments/task.md' +rm 'Introduction/Course View/task.md' +rm 'Introduction/Editor/task.md' +rm 'Introduction/Navigating Around/task.md' +rm 'Introduction/Our first program/task.md' +rm 'Introduction/Task Description/task.md' +rm 'Loops/Break keyword/task.md' +rm 'Loops/Continue keyword/task.md' +rm 'Loops/Else with loops/task.md' +rm 'Loops/For loop/task.md' +rm 'Loops/List Comprehension/task.md' +rm 'Loops/Loop over a string/task.md' +rm 'Loops/Nested List Comprehension/task.md' +rm 'Loops/Nested for Loop/task.md' +rm 'Loops/While loop/task.md' +rm 'Modules and packages/Built-in modules/task.md' +rm 'Modules and packages/Executing modules as scripts/task.md' +rm 'Modules and packages/From import/task.md' +rm 'Modules and packages/Import module/task.md' +rm 'Modules and packages/Packages/task.md' +rm 'README.md' +rm 'Strings/Basic string methods/task.md' +rm 'Strings/Character escaping/task.md' +rm 'Strings/Concatenation/task.md' +rm 'Strings/F-strings/task.md' +rm 'Strings/In operator/task.md' +rm 'Strings/String formatting/task.md' +rm 'Strings/String indexing/task.md' +rm 'Strings/String length/task.md' +rm 'Strings/String multiplication/task.md' +rm 'Strings/String negative indexing/task.md' +rm 'Strings/String slicing/task.md' +rm 'Variables/Arithmetic operators/task.md' +rm 'Variables/Assignments/task.md' +rm 'Variables/Boolean operators/task.md' +rm 'Variables/Comparison operators/task.md' +rm 'Variables/Type conversion/task.md' +rm 'Variables/Undefined variable/task.md' +rm 'Variables/Variable definition/task.md' +rm 'Variables/Variable types/task.md' diff --git a/Translations/README-ja.md b/Translations/README-ja.md new file mode 100644 index 0000000..92f329a --- /dev/null +++ b/Translations/README-ja.md @@ -0,0 +1,79 @@ +## 「Introduction to Python」(Python入門)コースの「説明」を日本語に翻訳しました: + +### 説明: + +表示される説明は英語です。 +日本人が Python を学びやすいように、日本語に翻訳しました。 + +--- + +### セットアップ手順: + + +#### 1. 「PyCharm」に下記のプラグインをインストールしておきます: + +- 「Edu Tools」 +- 「Japanese Language Pack」 + + +#### 2. 「PyCharm」の「Courses」タブで「Introduction to Python」コースを選択し、「Start」をクリックします: + +→「~/PycharmProjects/'Introduction to Python'/」フォルダが作成されます。 + +これはすでに行われているはずです。 + +#### 3. 念のため、元のファイルを保存してください: + +``` +$ cp -r ~/PycharmProjects ~/PycharmProjects-ORG +``` + +#### 4. 作業に使用するファイルを確認します: + +次のフォルダに添付ファイルがあるとします: + +``` +$ cd ~/PycharmProjects/'Introduction to Python'/Translations/ +$ ls -1 +Delete-md-File.sh +README-ja.md +README.md +ja.patch +screenshot-ja.jpg +``` + +#### 5. シェルスクリプトを実行可能に設定します: + +``` +$ chmod +x ./Delete-md-File.sh +``` + +#### 6. 対象となるファイルを削除するシェルスクリプトを実行します: + +``` +$ cd ~/PycharmProjects/'Introduction to Python'/ +$ ./Translations/Delete-md-File.sh +``` + +→パッチファイルを適用する際の以下のエラーを回避します: +"Hunk #1 FAILED at 1 (different line endings)." + +および、新しいファイルにすることで、パッチを適用しやすくします。 + +#### 7. パッチファイルを適用します: + +``` +$ patch -p1 A "~/PycharmProjects/'Introduction to Python'/" folder will be created. + +This should have already been done. + +#### 3. Save the original file just in case: + +``` +$ cp -r ~/PycharmProjects ~/PycharmProjects-ORG +``` + +#### 4. Check the files used for work: + +Suppose you have attachments in the following folders: + +``` +$ cd ~/PycharmProjects/'Introduction to Python'/Translations/ +$ ls -1 +Delete-md-File.sh +README-ja.md +README.md +ja.patch +screenshot-ja.jpg +``` + +#### 5. Set the shell script to be executable: + +``` +$ chmod +x ./Delete-md-File.sh +``` + +#### 6. Run a shell script that deletes the target file: + +``` +$ cd ~/PycharmProjects/'Introduction to Python'/ +$ ./Translations/Delete-md-File.sh +``` + +-> Avoid errors when applying patch files: +"Hunk #1 FAILED at 1 (different line endings)." + +And make it a new file to make it easier to apply. + +#### 7. Apply patch file: + +``` +$ patch -p1 A new md file is created in each file hierarchy. + +#### 8. Start and check: + +Double-click on the issue name in the tree on the left to see the translated description. + +--- + +### Attachment: + +(1). "README.md" : Setup procedure. +(2). "README-ja.md" : Setup procedure (Japanese version) +(3). "screenshot-ja.jpg" : Screen using "Introduction to Python" translated into Japanese +(4). "Delete-md-File.sh" : Shell script that deletes the target file +(5). "ja.patch" : patch file: + diff --git a/Translations/ja.patch b/Translations/ja.patch new file mode 100644 index 0000000..c999958 --- /dev/null +++ b/Translations/ja.patch @@ -0,0 +1,2551 @@ +diff -Naur "a/Classes and objects/Class and Instance Variables/task.md" "b/Classes and objects/Class and Instance Variables/task.md" +--- "a/Classes and objects/Class and Instance Variables/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Classes and objects/Class and Instance Variables/task.md" 2022-04-09 23:02:37.686574694 +0900 +@@ -0,0 +1,53 @@ ++## クラス変数とインスタンス変数 :(Class and Instance Variables) ++ ++一般に、「インスタンス変数」は各インスタンスに固有のデータ用であり、 ++「クラス変数」はクラスのすべてのインスタンスによって共有される属性とメソッド用です: ++ ++```python ++class Cat: ++ ++ species = "Felis catus" ++ ++ def __init__(self, breed, name): ++ self.breed = breed ++ self.name = name ++ ++cleo = Cat('mix', 'Cleo') ++furry = Cat('bengal', 'Furry') ++ ++print(cleo.name) ++print(cleo.species) ++print(furry.name) ++print(furry.species) ++``` ++ ++```text ++Cleo ++Felis catus ++Furry ++Felis catus ++``` ++`species`(種族)はすべてのインスタンスで共有されるクラス変数であり、 ++`name`(名前)と `breed`(品種)は各インスタンスに固有のインスタンス変数であることがわかります。 ++ ++共有データは、リストや辞書などの可変オブジェクトを含む場合、驚くべき効果をもたらす可能性があります。 ++ ++ ++クラス変数がリストであり、1つのオブジェクトに対して変更すると、 ++クラスのすべてのオブジェクトに対して変更されます ++ ++コードエディタの例を確認してください。 ++ ++`print(barsik.favorite_food)` が出力する内容を確認してください。 ++ ++リストを使用して各インスタンスに固有の機能を追跡する場合は、 ++リストをインスタンス属性にする必要があります。 ++ ++コードエディタで、`Animals` クラスの実装を完了して、以下の `print` ステートメントが次のような行を出力するようにします: ++ ++各ペットに `"This is Doggy the dog, one of my pets."` ++(これは私のペットの1匹である犬の犬です。) ++ ++
クラス変数には、すべてのインスタンス間で共有される情報が含まれている必要があります。("pets" の1つです)
++ ++
インスタンス変数には、インスタンスに固有の情報が含まれている必要があります。(名前は一意です)
+diff -Naur "a/Classes and objects/Definition/task.md" "b/Classes and objects/Definition/task.md" +--- "a/Classes and objects/Definition/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Classes and objects/Definition/task.md" 2022-04-09 23:02:37.682574653 +0900 +@@ -0,0 +1,54 @@ ++## 意味 :(Definition) ++ ++クラスは、データと機能をバンドルする手段を提供します。 ++ ++新しいクラスを作成すると、新しいタイプのオブジェクトが作成され、そのタイプの新しいインスタンスを作成できるようになります。 ++ ++クラスは基本的に、オブジェクトを作成するためのテンプレートです。 ++各クラスインスタンス(オブジェクト)には、その状態を維持するための属性を付加できます。 ++オブジェクトの関数はメソッドと呼ばれ、その状態を変更できます。 ++メソッドは、オブジェクトのクラスによって定義されます。 ++ ++クラス定義の一般化された形式は次のようになります: ++ ++``` ++class ClassName: ++ ++ . ++ . ++ . ++ ++``` ++ ++関数定義( `def` ステートメント)のようなクラス定義は、効果を発揮する前に実行する必要があります。 ++ ++クラス定義内のステートメントは通常関数定義ですが、他のステートメントが役立つ場合もあります。 ++クラス内の関数定義には通常、独特の形式の引数リストがあります。これについては後で説明します。 ++ ++クラスオブジェクトは、属性参照とインスタンス化の2種類の操作をサポートします。 ++ ++属性参照については、次のセクションで説明します。 ++ ++クラスのインスタンス化は関数表記を使用します。 ++クラスオブジェクトが、クラスの新しいインスタンスを返すパラメータのない関数であると想像してみてください。 ++ ++例えば: ++ ++```python ++class SomeClass: ++ """A simple example class""" ++ i = 12345 ++ ++x = SomeClass() ++``` ++`x = SomeClass()` は、クラスの新しいインスタンスを作成し、このオブジェクトをローカル変数 `x` に割り当てます。 ++ ++クラス定義構文の詳細については、Python ドキュメントの このセクション をご覧ください。 ++ ++`MyClass` 内の `variable` に値を割り当て、クラス `MyClass()` のオブジェクト `my_class` を作成します。 ++ ++コードを実行して、何が起こるかを確認してください。 ++ ++
任意の値を variable に割り当てます。
++ ++
テキストの例を見て、オブジェクトをインスタンス化する方法を理解してください。
+diff -Naur "a/Classes and objects/Special __init__ method/task.md" "b/Classes and objects/Special __init__ method/task.md" +--- "a/Classes and objects/Special __init__ method/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Classes and objects/Special __init__ method/task.md" 2022-04-09 23:02:37.682574653 +0900 +@@ -0,0 +1,49 @@ ++## 特別な__init__メソッド :(Special __init__ method) ++ ++インスタンス化操作(クラスオブジェクトの「呼び出し」)は空のオブジェクトを作成しますが、特定の初期状態にカスタマイズされたインスタンスを使用してオブジェクトを作成すると便利です。 ++ ++従って、クラスは `__init__()` という名前の特別なメソッドを定義する場合があります。 ++ ++このような: ++ ++ ++```python ++class MyClass: ++ def __init__(self): ++ self.data = [] ++``` ++`__init__` はPython で予約されているメソッドの1つです。 ++ ++定義されている場合、 `__init__()` メソッドは、クラスのインスタンスが作成されるときに自動的に呼び出され、オブジェクトとその属性を初期化します。 ++ ++それは常に少なくとも 1つの引数 `self` を取ります。 ++ ++従って、この例では、初期化された新しいインスタンスは次の方法で取得できます: ++ ++```python ++x = MyClass() ++``` ++ ++ `__init__()` メソッドは、柔軟性を高めるために引数を受け取る場合があります。 ++その場合、クラスインスタンス化演算子に与えられた引数は `__init__()` に渡されます。 ++ ++例えば: ++ ++```python ++class Complex: ++ def __init__(self, real_part, imag_part): ++ self.r = real_part ++ self.i = imag_part ++ self.num = complex(self.r, self.i) ++ ++x = Complex(3.0, -4.5) # Instantiating a complex number ++x.num ++``` ++```text ++(3-4.5j) ++``` ++ ++コードエディタで、`Car` クラスの `__init__()` メソッドにパラメータを追加します。 ++指定された色とブランドで作成します。 ++ ++
selfcolor の 2つのパラメータを追加します。
+diff -Naur "a/Classes and objects/The self parameter/task.md" "b/Classes and objects/The self parameter/task.md" +--- "a/Classes and objects/The self parameter/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Classes and objects/The self parameter/task.md" 2022-04-09 23:02:37.682574653 +0900 +@@ -0,0 +1,35 @@ ++## 自己パラメータ :(The self parameter) ++ ++前の課題で見た `self` パラメータを説明する時が来ました。 ++ ++クラスメソッドに渡される最初の引数は `self` です。これは単なる慣例にすぎません。 ++`self` という名前はPython にとって特別な意味はありません。 ++ ++規則に従うことをお勧めします。そうしないと、他のPython プログラマーがコードを読みにくくなる可能性があります。 ++ ++Python は `self` パラメータを使用して、作成または変更されたオブジェクトを参照します。 ++ ++メソッドは、`self` 引数のメソッド属性を使用して他のメソッドを呼び出すことができます: ++ ++```python ++class Bag: ++ def __init__(self): ++ self.data = [] ++ ++ def add(self, x): ++ self.data.append(x) ++ ++ def addtwice(self, x): ++ self.add(x) # Calling the method `add` from another method ++ self.add(x) ++``` ++ ++コードエディタで、`Calculator` クラスの `add` メソッドを実装します。 ++フィールド `current` に `amount` を追加する必要があります。 ++ ++さらに、メソッド `get_current` を完了します。 ++ ++コードを実行して、どのように機能するかを確認します。 ++ ++
amountself.current 変数に追加します。
++
+= 記号を使用します。
+diff -Naur "a/Classes and objects/Update variable/task.md" "b/Classes and objects/Update variable/task.md" +--- "a/Classes and objects/Update variable/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Classes and objects/Update variable/task.md" 2022-04-09 23:02:37.682574653 +0900 +@@ -0,0 +1,11 @@ ++## 変数を更新 :(Update variable) ++ ++この演習では、新しい `Car` オブジェクト `car2` を作成してから、`car2` の `color` を `"red"` に設定します。 ++ ++`description` メソッドを呼び出して、`car1` と `car2` の説明を出力します。 ++ ++
クラスを「呼び出す」ことにより、前の課題でオブジェクトをインスタンス化した方法を思い出してください。
++ ++
値の割り当て (=) と属性参照構文 obj.attributeを使用して色を変更します。
. ++ ++
printステートメントで、前の課題で行ったように description() メソッドを呼び出します。
+diff -Naur "a/Classes and objects/Variable access/task.md" "b/Classes and objects/Variable access/task.md" +--- "a/Classes and objects/Variable access/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Classes and objects/Variable access/task.md" 2022-04-09 23:02:37.682574653 +0900 +@@ -0,0 +1,27 @@ ++## 可変アクセス :(Variable access) ++ ++「属性参照」を使用して、オブジェクト内の変数にアクセスできます。 ++ ++「属性参照」は、Python のすべての属性参照に標準の構文 `obj.name` を使用します。 ++ ++有効な属性名は、クラスオブジェクトが作成されたときにクラスの名前空間にあったすべての名前です。 ++ ++従って、クラス定義が次のようになっている場合: ++ ++```python ++class MyClass: ++ year = 2021 ++ ++ def say_hello(self): ++ return 'hello world' ++``` ++ ++`MyClass.year` と `MyClass.say_hello` は、それぞれ整数と関数オブジェクトを返す有効な「属性参照」です。 ++ ++クラス属性を割り当てることができるため、割り当てによって `MyClass.year` の値を変更できます。 ++ ++例を確認して、`my_object` から `variable1` の値を出力してください。 ++ ++オブジェクト `my_object` の `foo` メソッドを呼び出し、結果を出力します。 ++ ++
object.name 構文を使用してvariable1 にアクセスします。
+diff -Naur "a/Classes and objects/__str__ vs __repr__/task.md" "b/Classes and objects/__str__ vs __repr__/task.md" +--- "a/Classes and objects/__str__ vs __repr__/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Classes and objects/__str__ vs __repr__/task.md" 2022-04-09 23:02:37.682574653 +0900 +@@ -0,0 +1,56 @@ ++## \_\_str__ と \_\_repr__ メソッド :(\_\_str__ vs \_\_repr__ methods) ++ ++Python の `str()` メソッドと `repr()` メソッドは、どちらもオブジェクトの文字列表現に使用されますが、いくつかの違いがあります。 ++ ++例えば: ++ ++```python ++s = 'Hello World' ++print (str(s)) ++print(repr(s)) ++``` ++```text ++Hello World ++'Hello World' ++``` ++ ++`repr()` 関数を使用して文字列を出力すると、引用符のペアで出力されます。 ++ ++`str()` はユーザーの出力を作成するときに使用され、 ++`repr()` は通常デバッグと開発に使用されます。 ++ ++ `repr()` は明確に、`str()` が読み取り可能である必要があります。 ++ ++`__init__` と同様に、メソッド `__repr__` と `__str__` は Python で予約されています。 ++ ++`print()` ステートメントと `str()` 組み込み関数は、オブジェクトのクラスで定義された `__str__` メソッドを使用して、その文字列表現を表示します。 ++ ++`repr()` 組み込み関数は、オブジェクトのクラスで定義された `__repr__` メソッドを使用します。 ++ ++従って、デバッグ用の詳細情報が必要な場合は、独自に定義したクラスに `__repr__` が必要です。 ++ ++また、ユーザーに文字列表現を使用すると便利だと思われる場合は、`__str__` 関数を作成する必要があります。 ++ ++ ++コードエディタでクラス `Complex` の別の実装を確認してください。 ++ ++コードを実行して、2つの `print` ステートメントのそれぞれが何を出力するかを確認します。 ++ ++クラス `Cat` に `__str__` メソッドと `__repr__` メソッドを実装します。 ++ ++`__str__` メソッドは次のような文字列を返す必要があります: ++ ++`"My siamese cat's name is Lucy"` ++(`"私のシャム猫の名前はルーシーです"`) ++ ++`__repr__` メソッドは次のような文字列を返す必要があります: ++ ++`"Cat, breed: siamese, name: Lucy"` ++(`"猫, 品種: シャム, 名前: ルーシー"`) ++ ++[f-strings](course://Strings/F-strings) を使用します。 ++ ++
self.attribute 構文を使用することを忘れないでください。
++ ++
アポストロフィを出力するために文字がエスケープされることを忘れないでください。
++ +diff -Naur "a/Condition expressions/Boolean operators/task.md" "b/Condition expressions/Boolean operators/task.md" +--- "a/Condition expressions/Boolean operators/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Condition expressions/Boolean operators/task.md" 2022-04-09 23:02:37.686574694 +0900 +@@ -0,0 +1,11 @@ ++## ブール演算子 :(Boolean operators) ++ ++ブール演算子はステートメントを比較し、結果をブール値で返します。 ++ ++ブール演算子 `and` は、`and` の両側の式が `True` の場合、`True` を返します。 ++ブール演算子 `or` は、`or` のいずれかの側の少なくとも1つの式が `True` である場合、`True` を返します。 ++ブール演算子 `not` は、先行するブール式を反転します。 ++ ++`name` が `"John"` と等しく、彼が `16` 以上の場合、`True` と評価される式を記述します。 ++ ++
and キーワードと >= 演算子を使用します
+diff -Naur "a/Condition expressions/Boolean operators order/task.md" "b/Condition expressions/Boolean operators order/task.md" +--- "a/Condition expressions/Boolean operators order/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Condition expressions/Boolean operators order/task.md" 2022-04-09 23:02:37.686574694 +0900 +@@ -0,0 +1,9 @@ ++## ブール演算子の順序 :(Boolean operators order) ++ ++ブール演算子は左から右に評価されません。ブール演算子の演算の順序があります。 ++ ++`not` が最初に評価され、` and` が次に評価され、`or` が最後に評価されます。 ++ ++`name` が `16` 以上で `25` より若い `"John"` または `"Jane"` のいずれかである場合、`True` と評価される式を記述します。 ++ ++
andor キーワードを組み合わせます。
+diff -Naur "a/Condition expressions/Else and elif parts in if statement/task.md" "b/Condition expressions/Else and elif parts in if statement/task.md" +--- "a/Condition expressions/Else and elif parts in if statement/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Condition expressions/Else and elif parts in if statement/task.md" 2022-04-09 23:02:37.686574694 +0900 +@@ -0,0 +1,32 @@ ++## else および elif ステートメント :(Else and elif parts in if statement) ++ ++`elif` および `else` ステートメントは `if` ステートメントを補完します。 ++ ++0個以上の `elif` 部分があり、`else` 部分はオプションです。キーワード `elif` は「else if」の略で、過度のインデントを回避するのに役立ちます。 ++ ++
if … elif … elif … シーケンスは、Java など他の言語で見られる switch または case ステートメントの代わりになります。
++ ++条件付き実行では、1つが `True` であることが判明するまで、式を1つずつ評価することにより、スイートの1つだけが選択されます。 ++ ++次に、そのスイートが実行され、`if` ステートメントの他の部分は評価されません。 ++ ++すべての式が `false` の場合、 `else` 句のスイート(存在する場合)が実行されます。 ++ ++```python ++a = 200 ++b = 33 ++if b > a: ++ print("b is greater than a") ++elif a == b: ++ print("a and b are equal") ++else: ++ print("a is greater than b") ++``` ++```text ++a is greater than b ++``` ++ ++`name` が `"John"` と等しい場合は `True` を出力し、そうでない場合は `False` を出力します。 ++ ++
if キーワードと == 演算子を使用します。
++
else キーワードを使用します。
+diff -Naur "a/Condition expressions/If statement/task.md" "b/Condition expressions/If statement/task.md" +--- "a/Condition expressions/If statement/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Condition expressions/If statement/task.md" 2022-04-09 23:02:37.686574694 +0900 +@@ -0,0 +1,36 @@ ++## If ステートメント :(If statement) ++ ++Python の複合ステートメントには、他のステートメント(のグループ)が含まれています。 ++それらは、何らかの方法でそれらの他のステートメントの実行に影響を与えるか、または制御します。 ++ ++おそらく最もよく知られているステートメントタイプは `if` ステートメントです。 ++`if` キーワードは、その表現が `True` であるかどうかをチェックした後、指定されたコードを実行する条件ステートメントを形成するために使用されます。 ++ ++Python はインデントを使用してコードブロックを定義します: ++ ++```python ++if value > 1000: ++ print("It's a large number!") # Indented block ++ a += 1 # Indented block ++ ++print("Outside the block!") ++``` ++ ++コードブロックはインデントで始まり、インデントされていない最初の行で終わります。 ++ ++インデントの量は、ブロック全体で一貫している必要があります。 ++通常、インデントには 4つの空白または 1つのタブが使用されます。 ++ ++インデントが正しくないと、`IndentationError` が発生します。 ++ ++実行するステートメントが 1つしかない場合は、それを `if` ステートメントと同じ行に配置できます: ++ ++```python ++if a > b: print("a is greater than b") ++``` ++ ++`tasks` リストが空の場合は `"empty"` を出力します。 ++リストがクリアされたら、もう一度確認し(別の条件が必要になる場合があります!)、 ++そうである場合は `'Now empty!'` を出力します。 ++ ++
len() 関数を使用して、 tasks が空かどうかを確認します。
+diff -Naur "a/Data structures/Dictionaries/task.md" "b/Data structures/Dictionaries/task.md" +--- "a/Data structures/Dictionaries/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/Dictionaries/task.md" 2022-04-09 23:02:37.690574737 +0900 +@@ -0,0 +1,39 @@ ++## 辞書 :(Dictionaries) ++ ++辞書はリストに似ていますが、インデックスの代わりにキーを検索して値にアクセスする点が異なります。 ++ ++キーは任意の不変タイプにすることができます。 ++文字列と数字は常にキーにすることができます。 ++タプルに不変オブジェクトのみが含まれている場合は、タプルをキーとして使用できます。 ++リストをキーとして使用することはできません。 ++ ++辞書を key: value のペアのセットと考えてください。 ++ ++ただし、キーは1つの辞書内で一意である必要があります。 ++ ++辞書は中かっこで囲まれています: ++ ++例: `dct = {'key1' : "value1", 'key2' : "value2"}` ++ ++中括弧のペアは空の辞書 `{}` を作成します。 ++ ++辞書は、`dict` コンストラクター(constructor) を使用して作成することもできます: ++ ++```python ++a = dict(one=1, two=2, three=3) ++b = {'one': 1, 'two': 2, 'three': 3} ++c = dict([('two', 2), ('one', 1), ('three', 3)]) ++print(a == b == c) ++``` ++```text ++True ++``` ++リストの値にアクセスするのと同じようにディクショナリの値にアクセスできますが、インデックスの代わりにキーを使用します。 ++ ++このデータ構造の詳細については、こちら をご覧ください。 ++ ++Jared( `"Jared"`)の番号 `570` を電話帳に追加します。 ++電話帳からGerard の番号を削除します。 ++電話帳の `phone_book` から Jane(ジェーン)の電話番号を出力します。 ++ ++
辞書のインデックスを使用します(例: dct[key]
) +diff -Naur "a/Data structures/Dictionary keys() and values()/task.md" "b/Data structures/Dictionary keys() and values()/task.md" +--- "a/Data structures/Dictionary keys() and values()/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/Dictionary keys() and values()/task.md" 2022-04-09 23:02:37.690574737 +0900 +@@ -0,0 +1,21 @@ ++## 辞書の keys() と values()  :(Dictionary keys() and values()) ++ ++辞書には、`keys()`、`values()`、`items()` などの便利なメソッドがたくさんあります。 ++ ++`keys()` メソッドは、辞書内のすべてのキーのリストを挿入順に表示するビューオブジェクトを返します。 ++ ++`values()` は、ディクショナリの値の新しいビューを返します。 ++ ++`items()` メソッドが呼び出されると、辞書のアイテムの新しいビューがリスト内のタプル `(key, value)` ペアとして返されます。 ++ ++ `dict.keys()`、`dict.values()`、および `dict.items()` によって返されるオブジェクトは、ディクショナリのエントリの動的ビューを提供します。つまり、ディクショナリが変更されると、ビューはこれらの変更を反映します。 ++ ++&shortcut:CodeCompletion; を使用して残りを探索できます。 ++ ++ `dict_name` の後にドットが続きます。 ++ ++辞書がサポートする操作の詳細については、こちら をご覧ください。 ++ ++電話帳の `phone_book` からすべての値を出力します。 ++ ++
メソッド values()を使用します。
+diff -Naur "a/Data structures/In keyword/task.md" "b/Data structures/In keyword/task.md" +--- "a/Data structures/In keyword/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/In keyword/task.md" 2022-04-09 23:02:37.690574737 +0900 +@@ -0,0 +1,14 @@ ++## In キーワード :(In keyword) ++ ++`in` キーワードは、リストまたは辞書に特定の項目が含まれているかどうかを確認するために使用されます。 ++文字列で行ったのと同じ方法で、リストまたは辞書に `in` を適用できます。 ++ ++ ++1) `grocery_dict` の値に番号 `6` が含まれているかどうかを確認します。 ++2) 辞書に `"basil"` (バジル)が含まれているかどうかを確認します。 ++ ++指定された順序で課題を完了してください。 ++ ++
in キーワードを使用します。
++ ++
.values() 属性と .keys() 属性を使用します。
+diff -Naur "a/Data structures/Join method/task.md" "b/Data structures/Join method/task.md" +--- "a/Data structures/Join method/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/Join method/task.md" 2022-04-09 23:02:37.686574694 +0900 +@@ -0,0 +1,44 @@ ++## join() メソッド :(Join method) ++ ++`.join()` は実際には文字列メソッドですが、文字列、リスト、タプルなどの反復可能なオブジェクトを理解する必要があるため、ここで説明します。 ++ ++この[メソッド](https://docs.python.org/3/library/stdtypes.html#str.join) は、反復可能なオブジェクトから文字列を作成するための柔軟な方法を提供します。 ++ ++iterable の各要素(list、string、tuple など)を文字列セパレータ(`join()` メソッドが呼び出される文字列)で結合し、連結された文字列を返します。 ++ ++iterable に文字列以外の値がある場合、`TypeError` が発生します。 ++ ++`join()` メソッドの構文は次のようになります: ++ ++```python ++string.join(iterable) ++``` ++ ++例: ++ ++```python ++string_ = 'abcde' # a string iterable ++tuple_ = ('aa', 'bb', 'cc') # a tuple iterable ++list_ = ['Python', 'programming language'] # a list iterable ++ ++print(' + '.join(string_)) # join with the ' + ' separator ++print(' = '.join(tuple_)) # join with the ' = ' separator ++ ++sep = ' is a ' ++print(sep.join(list_)) # join with the ' is a ' separator ++``` ++```text ++a + b + c + d + e ++aa = bb = cc ++Python is a programming language ++``` ++`print` ステートメントが次のように出力するように `joined` 変数に値を割り当てます: ++ ++```text ++I like apples and I like bananas and I like peaches and I like grapes ++``` ++ ++
例をよく見て、同じことをしてください!
++ ++
fruitsが反復可能であり、separator がセパレータ文字列です。
++ +diff -Naur "a/Data structures/List items/task.md" "b/Data structures/List items/task.md" +--- "a/Data structures/List items/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/List items/task.md" 2022-04-09 23:02:37.690574737 +0900 +@@ -0,0 +1,13 @@ ++## リストのアイテム :(List items) ++ ++個々のリスト要素と同様に、リストのスライスに割り当てることができます。 ++ ++次のような操作を行うことで、リストのサイズを変更したり、リストを完全にクリアしたりすることもできます: ++ ++```python ++animals[:] = [] ++``` ++ ++最後の 2つのアイテムを置き換えて、すべての `animals` の象 (elephants) を作ります。 ++ ++
例のようにスライスへの割り当てを使用します。
+diff -Naur "a/Data structures/Lists introduction/task.md" "b/Data structures/Lists introduction/task.md" +--- "a/Data structures/Lists introduction/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/Lists introduction/task.md" 2022-04-09 23:02:37.690574737 +0900 +@@ -0,0 +1,29 @@ ++## リストの紹介 :(Lists introduction) ++ ++Python には、データをグループ化するために使用されるいくつかの複合データ型があります。 ++ ++最も用途が広いのはリストです。 ++これは、角かっこで囲まれた一連のカンマ区切りの値(アイテム)として記述できます。 ++(例: `lst = [item1, item2]`) ++ ++リストにはさまざまなタイプのアイテムが含まれている場合がありますが、通常、リスト内のすべてのアイテムは同じタイプです。 ++ ++文字列と同様に、リストにはインデックスを付けてスライスすることができます。 ++([レッスン3](course:// Strings / Stringslicing)を参照) ++ ++すべてのスライス操作は、要求された要素を含む新しいリストを返します。 ++ ++リストは、連結などの操作もサポートします: ++ ++```python ++squares = [1, 4, 9, 16, 25] ++squares + [36, 49, 64, 81, 100] ++[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] ++``` ++ ++リストの詳細については、このページ をご覧ください。 ++ ++リストスライスを使用して `[4, 9, 16]` を出力します。 ++ ++
リストのスライス構文は、文字列の場合と同じように見えます: lst[index1:index2] ++インデックス index2 の要素は含まれていないことを忘れないでください!
+diff -Naur "a/Data structures/Lists operations/task.md" "b/Data structures/Lists operations/task.md" +--- "a/Data structures/Lists operations/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/Lists operations/task.md" 2022-04-09 23:02:37.690574737 +0900 +@@ -0,0 +1,35 @@ ++## リストの操作 :(List operations) ++ ++文字列とは異なり、リストは変更可能なタイプです。 ++つまり、`lst[index] = new_item` を使用してコンテンツを変更できます。 ++ ++```python ++cubes = [1, 8, 27, 65, 125] # something's wrong here ++4 ** 3 # the cube of 4 is 64, not 65! ++``` ++```text ++64 ++``` ++```python ++cubes[3] = 64 # replace the wrong value ++cubes ++``` ++```text ++[1, 8, 27, 64, 125] ++``` ++ `append()` メソッドまたはリスト連結を使用して、リストの最後に新しいアイテムを追加できます。 ++ ++```python ++squares = [1, 4, 9, 16, 25] ++squares.append(6**2) ++squares ++``` ++```text ++[1, 4, 9, 16, 25, 36] ++``` ++ ++このページ で他の多くの便利なリストメソッドについて調べてください。 ++ ++`animals` リストの `"dino"` を `"dinosaur"` に置き換えます。 ++ ++
リストのインデックス作成操作と値の割り当てを使用します。
+diff -Naur "a/Data structures/Nested Lists/task.md" "b/Data structures/Nested Lists/task.md" +--- "a/Data structures/Nested Lists/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/Nested Lists/task.md" 2022-04-09 23:02:37.690574737 +0900 +@@ -0,0 +1,41 @@ ++## ネストされたリスト :(Nested Lists) ++ ++リストには、他のリスト(サブリスト)も含め、あらゆる種類のオブジェクトを含めることができます。 ++このデータ構造は、「ネストされたリスト」と呼ばれます。 ++ ++ネストされたリストを使用して、データを階層構造に配置できます。 ++ ++ネストされたリストは、サブリストのコンマ区切りシーケンスを作成することで作成できます: ++ ++```python ++nested_list = [[1, 2, 3], [4, 5], 6] ++``` ++以前と同じように、インデックスを使用してネストされたリストのアイテムにアクセスできます: ++ ++```python ++print(nested_list[1]) ++print(nested_list[2]) ++``` ++Output: ++```text ++[4, 5] ++6 ++``` ++ ++複数のインデックスを使用して、ネストされたリストのサブリスト内のアイテムにアクセスできます。 ++`nested_list` から番号 `1` にアクセスするには、インデックス `0` を2回使用します。 ++ ++まず、要素 `[1,2,3]` にアクセスし、次にそのサブリストの最初の要素にアクセスします: ++ ++```python ++print(nested_list[0][0]) ++``` ++Output: ++```text ++1 ++``` ++ ++コードエディタで、インデックスを使用して、ネストされたリスト `my_list` の要素 `9` と `10` にアクセスして出力します。 ++ ++
行き詰まった場合は、「課題の説明」ウィンドウにある例をもう一度確認してください。
++ +diff -Naur "a/Data structures/Tuples/task.md" "b/Data structures/Tuples/task.md" +--- "a/Data structures/Tuples/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Data structures/Tuples/task.md" 2022-04-09 23:02:37.698574822 +0900 +@@ -0,0 +1,57 @@ ++## タプル :(Tuples) ++ ++タプルは、別の標準シーケンスデータ型を表します。 ++ ++それらはリストとほとんど同じです。 ++タプルとリストの唯一の重要な違いは、タプルは不変であるということです。 ++タプル内の要素を追加、置換、または削除することはできません。 ++ ++タプルは、括弧で囲まれたコンマ区切りの要素で構成されます。 ++ ++次に例を示します: ++ ++```python ++(a, b, c) ++``` ++ ++特別な状況は、0 または 1個のアイテムを含むタプルの構築です。 ++空のタプルは、空の括弧のペアで構成されます。 ++1つの項目を持つタプルは、値の後にコンマを付けて作成されます。 ++ ++例えば: ++ ++```python ++empty = () ++singleton = 'hello', # <-- note the trailing comma ++len(empty) ++``` ++```text ++0 ++``` ++```python ++len(singleton) ++``` ++```text ++1 ++``` ++```python ++singleton ++``` ++```text ++('hello',) ++``` ++ ++ステートメント `t = 12345, 54321, 'hello!'` は、タプルパッキングの例です。 ++ ++値 `12345`、 `54321`、および `hello!` はタプルに一緒にパックされます。 ++ ++他のいくつかのリストメソッドもタプルに適用できます。 ++ ++タプルの詳細については、こちら をご覧ください。 ++ ++タプル`alphabet` の長さを出力します。 ++次に、単一の要素 `'fun_tuple'` を使用してタプルを作成します。 ++コードを実行して、何が出力されるかを確認できます。 ++ ++
len() 関数を使用します。
++
1つの要素を持つタプルの末尾のコンマを忘れないでください。
+diff -Naur "a/File input output/Open file/task.md" "b/File input output/Open file/task.md" +--- "a/File input output/Open file/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/File input output/Open file/task.md" 2022-04-09 23:02:37.698574822 +0900 +@@ -0,0 +1,49 @@ ++## ファイルを開く :(Open file) ++ ++Python には、コンピューター上のファイルに対して情報を読み書きするための多数の組み込み関数があります。 ++ ++`open()` はファイルオブジェクトを返し、最も一般的には 2つの引数で使用されます: `open(filename, mode)`: ++ ++```python ++f = open('somefile.txt', 'w') ++``` ++ ++最初の引数は、ファイル名を含む文字列です。 ++ ++2番目の引数は、ファイルの使用方法を説明するいくつかの文字を含む別の文字列です。 ++ ++ファイルが読み取り専用の場合は `'r'`、書き込み専用の場合は `'w'`(同じ名前の既存のファイルは消去されます)、 ++追加するときは `'a'`(ファイルに書き込まれたデータはすべてそのファイルの最後に追加されます)、でファイルを開きます。 ++ ++読み取りと書き込みの両方のの場合は `'r+'` 、でファイルを開きます。 ++ ++mode 引数はオプションです。省略した場合は `'r'` が想定されます。 ++ ++ファイルオブジェクトを処理するときは、`with` キーワードを使用することをお勧めします。 ++利点は、コードスイートの終了後にファイルが適切に閉じられることです。 ++ ++```python ++with open('somefile.txt') as f: ++ read_data = f.read() ++ ++# We can check that the file has been automatically closed. ++f.closed ++``` ++→ファイルが自動的に閉じられたことを確認できます。 ++ ++```text ++True ++``` ++ ++**重要**: `with` キーワードを使用していない場合は、 `f.close()` を呼び出してファイルを閉じ、ファイルが使用しているシステムリソースを解放する必要があります。 ++ ++`with` ステートメントまたは `f.close()` の呼び出しによって、ファイルオブジェクトを閉じた後は使用できません。 ++ ++コードエディタで、 `with` ステートメントを使用して、ファイル `input1.txt` を読み取りモードで適切に開きます。 ++次の行のファイルに使用されている名前を確認して使用してください。 ++ ++その後、開いた出力ファイル `outfile` を閉じます。 ++ ++コードを実行した後、他のファイルの中で「コースの表示」ウィンドウに表示された出力ファイルを確認してください。 ++ ++
練習のためだけに!、 r 引数をメソッド open()に指定します。
+diff -Naur "a/File input output/Read file/task.md" "b/File input output/Read file/task.md" +--- "a/File input output/Read file/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/File input output/Read file/task.md" 2022-04-09 23:02:37.702574863 +0900 +@@ -0,0 +1,62 @@ ++## ファイルを読む :(Read file) ++ ++ファイルの内容を読み取るには、 `f.read(size)` を呼び出すことができます。 ++これは、ある量のデータを読み取り、それを文字列として返します。 ++サイズが省略または負の場合、ファイルの内容全体が読み取られて返されます。 ++ ++```python ++with open('somefile.txt') as f: ++ print(f.read()) ++``` ++```text ++Here's everything that's in the file.\n ++``` ++**注**: ファイルがマシンのメモリの 2倍の大きさである場合、問題が発生します。 ++ ++`f.readline()` はファイルから 1行を読み取ります。 ++ ++改行文字 (`\n`) は文字列の最後に残され、ファイルが改行で終わっていない場合にのみファイルの最後の行で省略されます。 ++ ++ `f.readline()` が空の文字列を返す場合、ファイルの終わりに達していますが、空白行は、単一の改行のみを含む文字列である`\n` で表されます。 ++ ++```python ++f.readline() ++``` ++```text ++'This is the first line of the file.\n' ++``` ++```python ++f.readline() ++``` ++```text ++'Second line of the file\n' ++``` ++```python ++f.readline() ++``` ++```text ++'' ++``` ++ ++ファイルから行を読み取るために、ファイルオブジェクトをループできます。 ++これはメモリ効率が高く、高速で、コードをシンプルにします: ++ ++```python ++for line in f: ++ print(line) ++``` ++```text ++This is the first line of the file. ++Second line of the file ++``` ++ ++リスト内のファイルのすべての行を読み取りたい場合は、 `list(f)` または `f.readlines()` を使用することもできます。 ++ ++詳細については、Python チュートリアルの [ファイルオブジェクトのメソッド](https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects) のセクションを確認してください。 ++ ++「input.txt」の内容を表示して、ファイルの行を繰り返して出力します。 ++次に、「input1.txt」の最初の行のみを出力します。 ++ ++
「課題の説明」ウィンドウの例のようにファイルオブジェクトをループします。
++
print 関数を使用します。
++
readline() メソッドを使用して 1行を出力します。
+diff -Naur "a/File input output/What next/task.md" "b/File input output/What next/task.md" +--- "a/File input output/What next/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/File input output/What next/task.md" 2022-04-09 23:02:37.706574906 +0900 +@@ -0,0 +1,17 @@ ++おめでとうございます、コースは終了しました。楽しんでいただけたでしょうか。:(What next) ++ ++一般的なフィードバックを残したい場合は、コースのマーケットプレイス[ページ](https://plugins.jetbrains.com/plugin/16630-introduction-to-python/reviews) にレビューを書いてください。 ++ ++貢献したい場合は、コースの[GitHubレポジトリ](https://github.com/jetbrains-academy/introduction_to_python) でプルリクエスト、または問題を自由に作成してください。 ++ ++### 次は何? ++ ++Python プログラミングの基本を学んだので、さらに深く掘り下げて新しいスキルを磨くことができます。 ++ここにあなたのためのいくつかのオプションがあります: ++ ++- [NumPyのコース](https://plugins.jetbrains.com/plugin/18302-python-libraries--numpy) で、最も広く使用されているPython ライブラリについて学びます。 ++- Pythonで[AMazing](https://plugins.jetbrains.com/plugin/17519-amazing) 迷路を構築する方法をご覧ください。 ++- [機械学習](https://plugins.jetbrains.com/plugin/18392-machine-learning-101) の基本をご覧ください。 ++- JetBrains Academy の[PythonCore](https://hyperskill.org/tracks/2) または [Python for Beginners](https://hyperskill.org/tracks/6) トラックでプロジェクトを確認してください。 ++ ++新しいコースとアップデートをお楽しみに! +diff -Naur "a/File input output/Write to file/task.md" "b/File input output/Write to file/task.md" +--- "a/File input output/Write to file/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/File input output/Write to file/task.md" 2022-04-09 23:02:37.702574863 +0900 +@@ -0,0 +1,69 @@ ++## ファイルに書き込む :(Write to file) ++ ++すでに述べたように、 `open()` の 2番目の引数として `'w'` を使用すると、ファイルは書き込み専用で開きます。 ++新しい空のファイルが作成されます。 ++ ++同じ名前の別のファイルがすでに存在する場合、そのファイルは消去されます。 ++既存のファイルにコンテンツを追加する場合は、 `'a'` (追加)修飾子を使用する必要があります。 ++ ++別のファイルオブジェクトメソッド `f.write(string)` は、 string の内容をファイルに書き込み、書き込まれた文字数を返します。 ++ ++```python ++f.write('This is a test\n') ++``` ++```text ++15 ++``` ++テキストモードの他のタイプのオブジェクトは、最初に文字列に変換する必要があります: ++ ++```python ++value = ('the answer', 42) ++s = str(value) # convert the tuple into string ++f.write(s) ++``` ++```python ++18 ++``` ++指定したテキストがファイルのどこに挿入されるかは、ファイルモードによって異なります (`'a'` と `'w'`) 。 ++ ++`'a'`: テキストはファイルの最後に挿入されます。 ++ ++`'w'`: テキストが最初に挿入される前に、ファイルは空になります。 ++ ++改行などの記号を文字列に含める場合(新しい行から開始する場合)、「+」を付けて追加します: ++ ++```python ++f.write('\n' + 'string,' + ' ' + 'another string') ++``` ++ ++これにより、新しい行が追加され、 `'文字列、別の文字列'`が書き込まれます。 ++ ++コードエディタで、`zoo` リストのすべての要素を "output.txt" に追加して、 ++出力が新しい行から追加され、要素が `' and '` で区切られるようにします。 ++ ' and '.join(lst) 構文を使用して、リスト要素を必要な文字列に結合します。 ++その後、同じ出力ファイルに `number` を追加します。 ++ ++
'a' 修飾子を使用して、ファイルの最後に行を追加します。
++
write() メソッドを使用します。
++
書き込む前に number を文字列に変換します。
++
各文字列の先頭に \n を追加して、別の行を編集するように書き込みます。
++ ++ ++## 次は何ですか? ++ ++さて、Python の基本をマスターしたら、次に何をすべきか疑問に思っていることでしょう。 ++ ++[JetBrains Academy](https://hi.hyperskill.org?utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=last-task) をチェックすることをお勧めします。 ++ ++JetBrains Academy を今すぐ試す理由は次のとおりです: ++ ++- 現在、37 のPython プロジェクトと348 のトピックが学習に利用可能であり、その数は増え続けています。 ++Kotlin やJava などの他のプログラミング言語も学習に利用できます。 ++ ++- さまざまな難易度のプロジェクトは、すべての人に柔軟な学習体験を提供します。 ++ ++- 包括的な学習トラックは、詳細な[ナレッジマップ](https://hyperskill.org/knowledge-map?utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=last-task) で補強されています。 ++ ++- どこでも学習: ブラウザを介してタブレットまたは携帯電話で学習を開始し、ラップトップまたはPC で続行できます。 [IDE でプロジェクトをビルド](https://hyperskill.org/plugin#python?utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=last-task) することもできます。 ++ ++JetBrains Academy の[ここ](https://hyperskill.org/onboarding?track=python&utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=last-task) に参加して、自分で試してみてください。 +diff -Naur "a/Functions/Args and kwargs/task.md" "b/Functions/Args and kwargs/task.md" +--- "a/Functions/Args and kwargs/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Functions/Args and kwargs/task.md" 2022-04-09 23:02:37.706574906 +0900 +@@ -0,0 +1,49 @@ ++## Args と kwargs :(Args and kwargs) ++ ++`**name` 形式の最後の正式なパラメータが存在する場合、仮パラメータに対応するものを除くすべてのキーワード引数を含む辞書([データ構造 — 辞書](course://Data structures/Dictionaries) を参照)を受け取ります。 ++ ++これは、形式パラメータリスト以外の任意の数の位置引数を含むタプルを受け取る形式 `*name` の形式パラメータと組み合わせることができます。(`*name` は `**name` の前に出現する必要があります) ++ ++例えば、コードエディタで次のような関数を定義すると、 ++「call 1」に示すように呼び出すことができ、次のように出力されます: ++ ++```text ++-- Do you know how to get to the Library ?  ←(図書館への行き方は ?) ++-- I'm sorry, I am not from here, no idea about the Library ←(図書館はわかりません) ++Do you at least have a cigar, sir?  ←(葉巻はありますか?) ++Sure, help yourself.  ←(助けてください。) ++---------------------------------------- ++lost_person : old banker  ←(失われた人 : 古い銀行家) ++other_guy : street clown  ←(他の男 : ストリートピエロ) ++scene : in a park  ←(シーン:公園で) ++``` ++ ++この関数は、任意の数の引数を使用して呼び出すことができます。 ++ ++これらの引数はタプルにまとめられます。([タプル](course://Data structures/Tuples) を参照) ++ ++可変の引数の前に、0個以上の通常の引数が発生する可能性があります。 ++私たちの場合、「場所」が 1つあります。 ++ ++ `*args` パラメータの後に発生する正式なパラメータはすべて「キーワードのみ」の引数です。つまり、位置引数ではなくキーワードとしてのみ使用できます。 ++ ++この関数を呼び出す別の方法を「call 2」に示します。これにより、同じ出力が得られます。 ++ ++### 課題 ++ ++コードエディタで、 `cat()` 関数の下のコードを変更して、 ++次のように出力します: ++ ++```text ++-- This cat would eat if you gave it anything ←(この猫は何かを食べるでしょう) ++-- Lovely fur, the Maine Coon  ←(素敵な毛皮、メインクーン) ++-- It's fat !  ←(太っている!) ++IT IS TOO FAT.  ←(太りすぎです。) ++YOU ARE FEEDING YOUR CAT TOO MUCH.  ←(猫に与えすぎ) ++``` ++ ++
* を使用して余分な位置引数をアンパックすることを忘れないでください。
++ ++
** を使用してキーワード引数を解凍することを忘れないでください。
++ ++
正式なパラメータfood の値を指定することを忘れないでください。
+diff -Naur "a/Functions/Default parameters/task.md" "b/Functions/Default parameters/task.md" +--- "a/Functions/Default parameters/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Functions/Default parameters/task.md" 2022-04-09 23:02:37.710574948 +0900 +@@ -0,0 +1,29 @@ ++## デフォルトのパラメータ :(Default parameters) ++ ++可変の引数で関数を定義することも可能です。 ++ ++組み合わせることができる 3つの形式があります。 ++最も便利な形式は、1つ以上の引数のデフォルト値を指定することです。 ++ ++これにより、定義されているよりも少ない引数で呼び出すことができる関数が作成されます。 ++ ++例えば、コードエディタの最初の関数を確認してください。 ++ ++この関数は、いくつかの方法で呼び出すことができます。 ++ ++- 必須の引数 `a` のみを与える: `multiply_by(3)` ++- オプションの引数の 1つを与える: `multiply_by(3, 47)`、または `multiply_by(3, c=47)` ++- またはすべての議論を与える: `multiply_by(3, 47, 0)` ++ ++`c=47` の 3番目のケースで行ったように、関数呼び出しで提供する引数を指定できます。 ++ ++これを指定しない場合、値は順序に従って割り当てられます。 ++ ++関数呼び出しと定義では、`=` 記号の前後にスペースを入れないでください。 ++ ++このトピックについて詳しくは、Pythonドキュメントの このセクション をご覧ください。 ++ ++### 課題 ++`hello()` 関数にパラメータを追加し、`name` パラメータのデフォルト値を設定します。 ++ ++
name パラメータのデフォルト値を指定します。
+diff -Naur a/Functions/Definition/task.md b/Functions/Definition/task.md +--- a/Functions/Definition/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Functions/Definition/task.md 2022-04-09 23:02:37.706574906 +0900 +@@ -0,0 +1,33 @@ ++## 意味 :(Definition) ++ ++関数は、コードを有用なブロックに分割し、より多くのものにするための便利な方法です。 ++ ++読み取り可能で、再利用できます。 ++ ++キーワード `def` は関数定義を導入します。 ++ ++その後に、関数名と仮パラメーターの括弧で囲まれたリスト(空の場合もあります)を続ける必要があります。 ++ ++関数の本体を形成するステートメントは次の行から始まり、インデントする必要があります。 ++ ++関数は、呼び出されたときにのみ実行されます。 ++ ++関数を呼び出すには、名前の後に括弧を付けて使用します: ++ ++```python ++def my_function(): # function definition ++ print("Hello from a function") ++ ++my_function() # function call ++``` ++ ++関数の定義について詳しくは、Pythonドキュメントの このセクション をご覧ください。 ++ ++### 課題 ++ ++- ループ内で関数 `my_function` を呼び出して、その呼び出しを 5回繰り返します ++- ファイル内の重複した `print` ステートメントを置き換えることができる関数を定義します。 ++ ++
() を使用して my_function 関数を呼び出します。
++ ++
Use the def キーワードを使用して、fun 関数を定義します。
+diff -Naur "a/Functions/Keyword Arguments/task.md" "b/Functions/Keyword Arguments/task.md" +--- "a/Functions/Keyword Arguments/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Functions/Keyword Arguments/task.md" 2022-04-09 23:02:37.706574906 +0900 +@@ -0,0 +1,48 @@ ++## キーワード引数 :(Keyword Arguments) ++ ++関数は `kwarg=value` の形式のキーワード引数を使用して呼び出すこともできることをすでに示唆しました。 ++ ++例えば、私たちが定義した関数 `cat()` は、1つの必須引数(`food`)と 3つのオプションの引数(`state`、 `action`、および `breed`)を受け入れます。 ++ ++次のいずれかの方法で呼び出すことができます(すべて試してみることができます): ++ ++```python ++cat('chicken') # 1 位置引数 ++cat(food='chicken') # 1 キーワード引数 ++cat(food='fish', action='bite') # 2 キーワード引数 ++cat(action='bite', food='fish') # 2 キーワード引数 ++cat('beef', 'happy', 'hiss') # 3 位置引数 ++cat('a hug', state='purrring') # 1 位置引数、1 キーワード引数 ++``` ++ ++関数呼び出しでは、キーワード引数は位置引数の後に続く必要があります。 ++ ++渡されるすべてのキーワード引数は、関数によって受け入れられる引数の 1つと一致する必要があり(例えば、`book` は `cat` 関数の有効な引数ではありません)、それらの順序は重要ではありません。 ++ ++これには、オプションではない引数も含まれます。(例えば、`cat(food='fish')` も有効です)。 ++ ++引数が値を複数回受け取ることはできません。 ++ ++次のすべての呼び出しは無効になります: ++ ++```python ++cat() # 必要な引数がありません ++cat(food='fish', 'dead') # キーワード引数の後の位置引数 ++cat('veggies', food='nothing') # 同じ引数の値が重複しています ++cat(actor='Johnny Depp') # 不明なキーワード引数 ++``` ++ ++### 課題 ++ ++エディタで、引数を指定して関数呼び出しを行い、次のように出力します: ++ ++```text ++-- This cat wouldn't growl if you gave it soup ++-- Lovely fur, the Sphinx ++-- It's still hungry! ++``` ++ ++
キーワード引数には、state='asleep' などの構文を使用します。
++ ++
キーワード引数として指定しない限り、必須の引数 food は最初の位置にある必要があります。
++ +diff -Naur "a/Functions/Parameters and call arguments/task.md" "b/Functions/Parameters and call arguments/task.md" +--- "a/Functions/Parameters and call arguments/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Functions/Parameters and call arguments/task.md" 2022-04-09 23:02:37.706574906 +0900 +@@ -0,0 +1,45 @@ ++## パラメータと呼び出し引数 :(Parameters and call arguments) ++ ++「関数パラメータ」は、関数名に続く括弧 `()` 内で定義されます。 ++ ++「パラメータ」は、関数に渡される引数の変数名として機能します。 ++ ++「パラメータ」と「引数」という用語は同じものを指します。つまり、関数に渡される情報です。 ++ ++ただし、「パラメータ」は関数定義の括弧内にリストされている「変数」であり、「引数」は関数が呼び出されたときに関数に送信される「値」です。 ++ ++デフォルトでは、関数は正しい数の引数を使用して呼び出す必要があります。 ++ ++関数が 2つの引数を予期している場合は、2つの引数を使用して呼び出す必要があります: ++ ++```python ++def my_function(name, surname): ++ print(name + " " + surname) ++ ++my_function("Jon", "Snow") ++``` ++ ++結果: ++```text ++Jon Snow ++``` ++ ++ただし、呼び出し中に引数を 1つだけ指定すると、次のようになります: ++ ++```python ++my_function("Sam") ++``` ++ ++`TypeError`が発生します: ++```text ++TypeError Traceback (most recent call last) ++ in ++----> 1 my_function('Jon') ++ ++TypeError: my_function() missing 1 required positional argument: 'surname' ++``` ++ ++### 課題 ++コードエディタで、渡されたパラメータの 2乗を出力する関数を定義します。 ++ ++
関数定義の括弧内に x パラメーターを追加します。
+diff -Naur a/Functions/Recursion/task.md b/Functions/Recursion/task.md +--- a/Functions/Recursion/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Functions/Recursion/task.md 2022-04-09 23:02:37.706574906 +0900 +@@ -0,0 +1,70 @@ ++## 再帰 :(Recursion) ++ ++recursion という単語は、ラテン語の recurrere に由来します。 ++これは、戻る、元に戻す、または繰り返すことを意味します。 ++ ++プログラミングでは、再帰とは、関数がそれ自体を呼び出すコーディング手法を指します。 ++ ++ほとんどの場合、再帰は必要ありませんが、状況によっては、自己参照の定義が必要です。 ++ ++ツリーのようなデータ構造を使うことは良い例です。 ++このような構造はネストされており、再帰的定義に容易に適合します。 ++ ++同じ課題の非再帰的アルゴリズムは非常に面倒です。 ++ ++これは再帰関数の簡単な例です。 ++ ++引数として数値を取り、指定された引数からゼロまでの数値を出力します。 ++ ++再帰呼び出しでは、引数は現在の `n` の値より1小さいため、各再帰は基本ケース(ゼロ)に近づきます。 ++ ++```python ++def countdown(n): ++ print(n, end=' ') ++ if n == 0: ++ return # 再帰を終了 ++ else: ++ countdown(n - 1) # 再帰呼び出し ++ ++ ++countdown(4) ++``` ++```text ++10 9 8 7 6 5 4 3 2 1 0 ++``` ++ ++
この関数は引数の妥当性をチェックしません。n ++が非整数または負の場合、 RecursionError が発生します。 ++ ++基本ケースに到達しないための例外: ++ ++```python ++countdown(-10) ++``` ++```text ++RecursionError: maximum recursion depth exceeded while calling a Python object ++``` ++sys モジュールの関数を使用して、Python の再帰制限を確認できます。 ++`getrecursionlimit()` と呼ばれ、 `setrecursionlimit()` で変更できます: ++ ++```python ++from sys import setrecursionlimit ++setrecursionlimit(3000) ++getrecursionlimit() ++``` ++```text ++3000 ++``` ++
++ ++再帰はすべての状況で役立つわけではないことに注意してください。 ++一部の問題では、再帰的な解決策は可能ですが、エレガントというよりは厄介です。 ++ ++再帰的な実装は、非再帰的な実装よりも多くのメモリを消費することが多く、場合によっては実行が遅くなる可能性があります。 ++ ++### 課題 ++コードエディタで、正の整数の[階乗](https://en.wikipedia.org/wiki/Factorial) を計算する再帰関数を実装します。 ++ ++1 と 0 の場合は 1 を返し、1つおきの数値については、この数値 (`n`) と前の数値の階乗 (`n-1`) の積を計算します。 ++ ++
再帰関数呼び出しを忘れないでください。
+diff -Naur "a/Functions/Return value/task.md" "b/Functions/Return value/task.md" +--- "a/Functions/Return value/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Functions/Return value/task.md" 2022-04-09 23:02:37.710574948 +0900 +@@ -0,0 +1,25 @@ ++## 戻り値 :(Return value) ++ ++関数は、キーワード `return` を使用して、呼び出し元に値を返す場合があります。 ++戻り値を使用して変数に割り当てるか、単に出力することができます。 ++ ++実際、`return` ステートメントのない関数でも値を返します。 ++ ++この値は `None`(なし)と呼ばれます(組み込みの名前です)。 ++ ++値 `None` の書き込みは通常、インタープリタによって抑制されますが、 ++本当に見たい場合は、 `print(some_func())` を使用できます。 ++ ++>関数本体の最初のステートメントは、オプションで文字列リテラルにすることができます。この文字列リテラルは、関数のドキュメント文字列または docstring です。 ++( docstring の詳細については、Pythonドキュメントの ドキュメント文字列 をご覧ください。) ++作成するコードに docstring を含めることをお勧めします。 ++ ++「フィボナッチ数列」では、最初の 2つの数字は `1` と `1` であり、その後はそれぞれ ++数値は前の 2つの合計です。 ++ ++### 課題 ++`n` までの「フィボナッチ数列」の数のリストを返す関数を記述します。 ++ ++
b を 1で初期化します。
++
ba + bで更新します。
++
atmp_varで更新します。
+diff -Naur a/Introduction/About/task.md b/Introduction/About/task.md +--- a/Introduction/About/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Introduction/About/task.md 2022-04-09 23:02:37.710574948 +0900 +@@ -0,0 +1,29 @@ ++## コースについて ++ ++Python プログラミングの基礎のコースへようこそ! ++ ++#### なぜ Python を学ぶのですか? ++ ++Python は、世界で最も人気のあるプログラミング言語の1つです。 ++Pythonは、データサイエンス、ML、AI で広く使用されており、最も急速に成長している主要なプログラミング言語です。 ++ ++これは、プログラミングに精通するための完璧な出発点です。 ++Python は、他のほとんどのプログラミング言語よりも読み取り、書き込み、学習が簡単です。 ++Python を使用すると、単純な初心者の課題にとらわれることはありません。 ++多数の Python フォーラムと Q&A プラットフォーム、およびサポートを提供するオープンソースコミュニティは、学習意欲を維持するのに役立つ貴重なリソースです。 ++ ++#### コースの目的 ++ ++このコースを完了すると、次のことができるようになります。 ++ ++- 変数、データ構造、関数、クラスなどの基本的なプログラミングの概念を理解して利用できます。 ++- Python コードを読めます。 ++- Python で簡単なプログラムを作成できます。 ++- Python モジュールおよびパッケージを操作できます。 ++- 他のコースでPython を学び続け、より複雑な資料を提供します。 ++ ++#### 前提条件 ++ ++このコースを完了するために、Python やプログラミング全般の経験は必要ありません。 ++ ++頑張って! +diff -Naur a/Introduction/Comments/task.md b/Introduction/Comments/task.md +--- a/Introduction/Comments/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Introduction/Comments/task.md 2022-04-09 23:02:37.714574991 +0900 +@@ -0,0 +1,40 @@ ++## コメント :(Comments) ++ ++Python のコメントは、ハッシュ文字 (`#`) と単一のスペースで始まり、物理行の終わりまで続きます。 ++ ++ &shortcut:CommentByLineComment; を使うと、 ++PyCharm の行全体またはコードブロックのコメントまたはコメント解除ができます。 ++ ++コードを変更したときは、常にコメントを最新の状態に保つことを優先してください。 ++ ++コードと矛盾するコメントは、コメントがない場合よりも悪いことです。 ++また、不必要ですが、明白なことを述べている場合、実際にはかなり気が散ります。 ++ ++なので、これを行わないでください: ++ ++```python ++x = x + 1 # Increment x ++``` ++コメントは完全な文章である必要があります。最初の単語は、小文字で始まる識別子でない限り、大文字にする必要があります。コメントが明確で、他の人にもわかりやすいものであることを確認してください。 ++ ++#### ブロックコメント :(Block Comments) ++ ++ブロックコメントは通常、それに続く一部(またはすべて)のコードに適用され、そのコードと同じレベルにインデントされます。 ++ ++#### インラインコメント :(Inline Comments) ++ ++インラインコメントは慎重に使用してください。 ++インラインコメントは、ステートメントと同じ行のコメントです。 ++インラインコメントは、ステートメントから少なくとも 2つのスペースで区切る必要があります。 ++ ++適切なコメントの詳細については、PEP 8 – Style Guide for Python Code を参照してください。 ++ ++削除したくない場合は、コードの 1行またはブロックにコメントを付けることもできます。現時点では必要ありません。 ++ ++### 課題 ++コードエディタで、出力しないことを示す `print` ステートメントで、行にコメントを付けます。 ++コードが強調表示されなくなった様子を確認ください。 ++ ++
++ # とその print ステートメントの前にスペースを追加します。他はすべてそのままにしておきます。 ++
+diff -Naur "a/Introduction/Course View/task.md" "b/Introduction/Course View/task.md" +--- "a/Introduction/Course View/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Introduction/Course View/task.md" 2022-04-09 23:02:37.714574991 +0900 +@@ -0,0 +1,21 @@ ++## コースの表示 :(Course View) ++ ++「コースの表示」 (Course) ウィンドウには、コースの項目が表示されます: 課題を含むレッスンの一覧です: ++ ++ ++ ++ ++名前をダブルクリックすると、任意の課題に移動できます。 ++ ++「コースの表示」ウィンドウを非表示にするには、「プロジェクトツール」のウィンドウ ボタンをクリックするか、 &shortcut:ActivateProjectToolWindow; を押します。 ++ ++これにより、「編集エリア」ウィンドウと「課題の説明」ウィンドウ用のスペースが増えます。 ++ ++非表示の「コースの表示」ウィンドウを表示するには、[プロジェクトツールウィンドウ]ボタンをクリックします。または、&shortcut:ActivateProjectToolWindow; を再び押します。 ++ +diff -Naur a/Introduction/Editor/task.md b/Introduction/Editor/task.md +--- a/Introduction/Editor/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Introduction/Editor/task.md 2022-04-09 23:02:37.714574991 +0900 +@@ -0,0 +1,24 @@ ++## 編集エリア :(Editor) ++ ++「編集エリア」 (Editor) は、プログラミングを行うための遊び場です。チェックせずに理論的な課題やクイズに取り組んでいる間、ここで実験することができます。 ++ ++プログラミングの割り当ての場合、「編集エリア」は既存のコードを修正するか、独自のコードを最初から作成する場所です。このコードがチェックされます。 ++ ++ ++ ++ ++コードをいつでも実行するには、コンテキストメニューから[実行]オプションを選択するか、&shortcut:Run; を押します: ++ ++ ++ ++ ++「編集エリア」に戻ってコードに集中したい場合に、最も速いやり方は、[すべてのウィンドウを非表示]コマンド ++ (&shortcut:HideAllWindows;) を使うことです。 ++すべてのウィンドウを元に戻すには、コマンドを繰り返します。 ++ +diff -Naur "a/Introduction/Navigating Around/task.md" "b/Introduction/Navigating Around/task.md" +--- "a/Introduction/Navigating Around/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Introduction/Navigating Around/task.md" 2022-04-09 23:02:37.710574948 +0900 +@@ -0,0 +1,25 @@ ++## EduToolsプラグインの概要 :( EduTools plugin overview) ++ ++このレッスンは、[EduTools プラグイン](https://www.jetbrains.com/help/education/educational-products.html) を使用して最初のステップを実行し、それを使用してPython を学習するのに役立ちます。 ++ ++EduTools プラグインを使用すると、コーディングタスクを完了してプログラミング言語とツールを学習し、IDE 内で即座にフィードバックを得ることができます。 ++ ++十分に話しましょう – 始めましょう! ++ ++インターフェースに既に精通している場合は、このレッスンをスキップできます。 ++ ++### コースでの作業 ++EduTools で利用できるすべてのコースは、レッスンのリストとして構成されています。 ++次に、レッスンをセクションにグループ化できます。 ++各レッスンにはいくつかの課題が含まれています。 ++ ++コースを開くと、ナビゲーションに使用されるメインのツールウィンドウが表示されます: ++ ++「コースの表示」ウィンドウ ++「編集エリア」ウィンドウ ++「課題の説明」ウィンドウ ++ ++ ++ ++「Next」(次へ)ボタンをクリックして、次の課題に移動します。 ++ +diff -Naur "a/Introduction/Our first program/task.md" "b/Introduction/Our first program/task.md" +--- "a/Introduction/Our first program/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Introduction/Our first program/task.md" 2022-04-09 23:02:37.714574991 +0900 +@@ -0,0 +1,29 @@ ++## 私たちの最初のプログラム :(Our first program) ++ ++従来、プログラミング言語で最初に作成するプログラムは `"Hello World!"` です。 ++ ++こちらでも紹介します。 ++ ++このスクリプトを実行するには、 **Editor** ビュー(編集画面)の任意の場所を「右クリック」して、 ++コンテキストメニューを表示し、**実行 'hello_world'** を選択します。 ++ ++または、&shortcut:RunClass; ショートカットを使用することもできます。 ++PyCharm Edu でのみ、![](execute.svg) 男の子アイコンを使用できます。 ++ ++詳細については、[私たちのヘルプ](https://www.jetbrains.com/help/pycharm/running-and-rerunning-applications.html) をご覧ください。 ++ ++## JetBrains アカデミー :(JetBrains Academy) ++ ++この課題が難しすぎると思われる場合、または、より構造化された詳細なカリキュラムを探している場合は、 ++ [JetBrains Academy](https://hi.hyperskill.org?utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=first-task) を試してみることをお勧めします。 ++ ++JetBrains Academy を試す理由はたくさんあります。それらのほんの一部を次に示します: ++ ++- 詳細な[ナレッジマップ](https://hyperskill.org/knowledge-map?utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=first-task) を含む包括的な学習トラック。 ++ ++- スキルレベルに合わせて柔軟な学習体験を提供する、さまざまな難易度のプロジェクト。 ++ ++- [専門能力開発ツール](https://hyperskill.org/plugin?utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=first-task) を使用して練習し、習得することができます。 ++ ++Join JetBrains Academy の [こちら](https://hyperskill.org/onboarding?track=python&utm_source=ide&utm_medium=ide&utm_campaign=ide&utm_content=first-task) に参加して、自分で試してみてください。 ++ +diff -Naur "a/Introduction/Task Description/task.md" "b/Introduction/Task Description/task.md" +--- "a/Introduction/Task Description/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Introduction/Task Description/task.md" 2022-04-09 23:02:37.714574991 +0900 +@@ -0,0 +1,46 @@ ++## 課題の説明 :(Task Description) ++ ++**課題の説明** (Description) ウィンドウには、課題を完了するために必要なすべての情報が表示されます。 ++ ++理論的な課題の場合、説明は学習および読み物を提供します。 ++クイズの場合、それは複数の選択肢の質問を提供します。 ++プログラミングの割り当てについては、解決すべき問題が記載されています。 ++ ++次のアクションには、「課題の説明」ウィンドウのアイコンを使用します: ++ ++|アイコン |説明 | ++| ------------------------------------ | ------------------------------- | ++|**チェック** | クイズの回答 またはプログラム課題のコードが正しいか確認| ++| **実行** | コードを実行します(理論上の課題)| ++|![](images/back.svg) | 前のタスクに移動| ++|![](images/forward.svg) または **次へ** | 次のタスクに進む| ++|![](images/reset.svg) | タスクで行ったすべての変更を破棄し、最初からやり直します| ++|![](images/commentTask.svg) | Stepikで課題ページを表示し、コメントを残してください| ++|ソリューションのピーク...| 正解を明らかにし、差分を表示します。| ++ ++「課題の説明」ウィンドウを完全に非表示にせずに、表示したままにしておくことをオススメします。 ++ ++気が散る場合は、「課題の説明」ウィンドウの右上隅にある ![](images/hideToolWindow.svg) ボタンをクリックして非表示にできます。 ++ ++2台のモニタを使用する場合は、「課題の説明」ウィンドウ(パネル)をフローティングモードに切り替えて、2台目のモニタに移動するか、IDE のメインウィンドウの近くに配置すると便利な場合があります。 ++ ++これを行うには、ツールウィンドウの設定 ![](images/gear.svg) アイコンをクリックします: ++ ++ ++ ++ ++ +diff -Naur "a/Loops/Break keyword/task.md" "b/Loops/Break keyword/task.md" +--- "a/Loops/Break keyword/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/Break keyword/task.md" 2022-04-09 23:02:37.722575075 +0900 +@@ -0,0 +1,14 @@ ++## Break キーワード :(Break keyword) ++ ++無限ループは、決して終了しないループです。 ++ループ条件が常に`True`である場合、そのようなループは無限になります。 ++ ++無限ループを作成する最も簡単な方法は、`while True` を使用することです。 ++`break` キーワードは、ループをエスケープするために使用されます。 ++ ++`animal` が `elephant` と等しいかどうかを評価した後、3回目の反復でループを終了する条件を記述します。 ++ `break` ステートメントを使用します。 ++最後の `zoo` リストには `lion` と `tiger` だけが含まれている必要があります(ループ内の他のすべてのものを `pop` するため)。 ++ ++
== を使用して、animal"elephant" と等しいかどうかを確認します。
++ +diff -Naur "a/Loops/Continue keyword/task.md" "b/Loops/Continue keyword/task.md" +--- "a/Loops/Continue keyword/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/Continue keyword/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,11 @@ ++## continue キーワード :(Continue keyword) ++ ++`continue` キーワードは、現在の反復でのみループ内の残りのコードをスキップし、次の反復に進むために使用されます。 ++ ++ループは `for` または `while` ステートメントに戻り、条件を再度評価します。 ++次の項目がない場合、存在する場合は `else` 句が実行されます。 ++ ++奇数の `1、3、5、7、9` のみを出力します。 ++ ++
% 演算子を使用して、x が偶数かどうかを確認します。
++ +diff -Naur "a/Loops/Else with loops/task.md" "b/Loops/Else with loops/task.md" +--- "a/Loops/Else with loops/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/Else with loops/task.md" 2022-04-09 23:02:37.722575075 +0900 +@@ -0,0 +1,41 @@ ++## Else with ループ :(Else with loops) ++ ++「それ以外の場合はループ」 ++ ++`break` ステートメントは、最も内側を囲む `for` または `while` ループから抜け出すことがわかりました。 ++Python では、ループステートメントに `else` 句を含めることもできます。 ++ ++iterable の枯渇( `for` を使用)によってループが終了したとき、または条件が `False`( `while` を使用)になったときに実行されますが、ループが `break` ステートメントによって終了したときは実行されません。 ++ ++素数を検索するループの次の例を確認してください: ++ ++```python ++for n in range(2, 10): ++ for x in range(2, n): ++ if n % x == 0: ++ print(n, 'equals', x, '*', n//x) ++ break ++ else: ++ # loop fell through without finding a factor ++ print(n, 'is a prime number') ++``` ++```text ++2 is a prime number ++3 is a prime number ++4 equals 2 * 2 ++5 is a prime number ++6 equals 2 * 3 ++7 is a prime number ++8 equals 2 * 4 ++9 equals 3 * 3 ++``` ++ ++このコードでは、`else` 句は `if` ステートメントではなく、`for` ループに属しています。 ++ ++`if` ステートメントの後の `else` はスキップされ、 `if` に続く式が `True` の場合は実行されませんが、 ++ループの場合、(どこかに「休憩」がない限り)`else` 句はループ自体が完了した後に実行されます。 ++ ++コードエディタで、2行目のコードを 2行目に追加して、ループが 1 と 2 の数字のみを出力し、 ++`"for loop is done"` というフレーズを出力しないようにします。 ++ ++
番号3で終了する必要があります。
+diff -Naur "a/Loops/For loop/task.md" "b/Loops/For loop/task.md" +--- "a/Loops/For loop/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/For loop/task.md" 2022-04-09 23:02:37.714574991 +0900 +@@ -0,0 +1,16 @@ ++## for ループ :(for loop) ++ ++`for` ステートメントは、シーケンスの要素(文字列、タプル、リストなど)または別の反復可能なオブジェクトを反復処理するために使用されます。 ++ ++シーケンスは 1回評価されます。 ++各反復で、`for` ループで定義された変数がリスト内の次の値に割り当てられます。 ++`for`ステートメントの行に続くコードは、アイテムごとに 1回実行されます。 ++アイテムが使い果たされると、ループは終了します。 ++ ++Pythonドキュメントの このページ で `for` ステートメントの詳細を読むことができます。 ++ ++`for` ループを使用して、`primes` リストから各素数を出力します。 ++素数は `1` より大きい自然数であり、`1` とそれ自体以外に正の約数はありません。 ++ ++
for ループを使用して、primes を反復処理し、各要素を1つずつ出力します。
++ +diff -Naur "a/Loops/List Comprehension/task.md" "b/Loops/List Comprehension/task.md" +--- "a/Loops/List Comprehension/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/List Comprehension/task.md" 2022-04-09 23:02:37.722575075 +0900 +@@ -0,0 +1,52 @@ ++## リスト内包 :(List Comprehension) ++ ++ループを使用して、リスト(または別のデータ構造)を作成できます。 ++ ++例えば: ++ ++ ++```python ++my_list = [] ++for i in range(5): ++ my_list.append(i) ++ ++print(my_list) ++``` ++ ++出力: ++```text ++[0, 1, 2, 3, 4] ++``` ++ ++これは素晴らしいですが、かなりかさばります。 ++ ++リスト内包表記は、既存のリストまたは別の反復可能オブジェクト(タプル、文字列、配列、範囲など)の値に基づいて新しいリストを作成する場合に、よりコンパクトな構文を提供します。 ++ ++それは同じタスクを実行し、プログラムを簡素化します。 ++通常、リスト内包表記は 1行のコードで記述されます。 ++ ++ ++```python ++my_list = [i for i in range(5)] ++print(my_list) ++``` ++出力: ++```text ++[0, 1, 2, 3, 4] ++``` ++ ++リスト内包表記は、`for` ループよりも計算効率が高くなります。 ++ ++コードエディタで、リスト内包表記を使用して、各要素に $10$ を追加することにより、 ++`my_inefficient_list` の要素から `my_efficient_list` を作成します。 ++ ++例えば、`my_inefficient_list` の最初の要素は $1 + 10 = 11$ であるため、 ++`my_efficient_list` の最初の要素は $11 + 10 = 21$ になります。 ++ ++
++ ++上記の例では、 `i for i in range(5)` を使用しました。この式の中で、好きなように `i` を変更できます。 ++ ++例えば、すべての `i` から `5` を引くには、 `i - 5 for i in range(5)` に対して `i - 5` を実行できます。 ++
++ +diff -Naur "a/Loops/Loop over a string/task.md" "b/Loops/Loop over a string/task.md" +--- "a/Loops/Loop over a string/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/Loop over a string/task.md" 2022-04-09 23:02:37.722575075 +0900 +@@ -0,0 +1,10 @@ ++## 文字列をループする :( Loop over a string) ++ ++前に説明したように、Python の文字列は多くの点でリストに似ています。 ++リストを反復処理するのと同じように、文字列を反復処理できます。 ++ ++ループを使用して、`hello_world` に含まれる文字数をカウントします。 ++この数値を変数 `length` に格納します。 ++ ++
for ループを使用して、hello_world 文字列を反復処理します。
++ +diff -Naur "a/Loops/Nested List Comprehension/task.md" "b/Loops/Nested List Comprehension/task.md" +--- "a/Loops/Nested List Comprehension/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/Nested List Comprehension/task.md" 2022-04-09 23:02:37.722575075 +0900 +@@ -0,0 +1,49 @@ ++## ネストされたリスト内包 :(Nested List Comprehension) ++ ++「ネストされたリスト内包」は、他の「リスト内包」内のネストされた「リスト内包」です。 ++ ++これは「[ネストされたループ](course://Loops/Nested for Loop) 」と非常によく似ています。 ++ ++「ネストされたループ」を使用して「[ネストされたリスト](course://Data structures/Nested Lists) 」を構築するプログラムは次のとおりです: ++ ++```python ++matrix = [] ++ ++for i in range(3): ++ ++ # Append an empty sublist inside the list ++ matrix.append([]) ++ ++ for j in range(0, 10, 2): ++ matrix[i].append(j) ++ ++print(matrix) ++``` ++ ++出力: ++```text ++[[0, 2, 4, 6, 8], [0, 2, 4, 6, 8], [0, 2, 4, 6, 8]] ++``` ++ ++「ネストされたリスト内包」表記を使用すると、同じことが 1行で実行できます: ++ ++```python ++matrix = [[j for j in range(0, 10, 2)] for i in range(3)] ++print(matrix) ++``` ++出力: ++```text ++[[0, 2, 4, 6, 8], [0, 2, 4, 6, 8], [0, 2, 4, 6, 8]] ++``` ++ ++### 課題 ++ ++各行(サブリスト)に `string` の **文字(characters)** 0〜9 が含まれるように、$10×10$ の `matrix` を作成します。 ++リスト内包表記 (list comprehension) を使用して、1行のコードで課題を完了します。 ++ ++
++ ++「課題の説明」ウィンドウの例に従ってください。範囲の 1つではなく、反復可能として `string` を使用する必要があります。 ++ ++
++ +diff -Naur "a/Loops/Nested for Loop/task.md" "b/Loops/Nested for Loop/task.md" +--- "a/Loops/Nested for Loop/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/Nested for Loop/task.md" 2022-04-09 23:02:37.722575075 +0900 +@@ -0,0 +1,54 @@ ++## ネストされたループ :(Nested Loops) ++ ++ネストされたループは、別のループ内のループです。 ++内側のループは、外側のループの反復ごとに 1回実行されます。 ++ ++```python ++adjectives = ["black", "stylish", "expensive"] ++clothes = ["jacket", "shirt", "boots"] ++ ++for x in adjectives: ++ for y in clothes: ++ print(x, y) ++``` ++出力: ++```text ++black jacket ++black shirt ++black boots ++stylish jacket ++stylish shirt ++stylish boots ++expensive jacket ++expensive shirt ++expensive boots ++``` ++ ++
++ ++どのタイプのループも別のループ内にネストできることに注意してください。 ++例えば、 [`while` loop](course://Loops/While loop) (詳細を参照)は、`for` ループ内にネストできます。 ++その逆も可能です。 ++
++ ++3x3 の三目並べボードが与えられます。 ++課題は、すべての位置を出力することです。 ++各辺に沿った座標は、リスト `coordinates` に保存されます。 ++ ++出力は次のようになります: ++ ++```text ++1 x 1 ++1 x 2 ++1 x 3 ++2 x 1 ++... ++``` ++ ++座標のすべての組み合わせについても同様です。 ++ ++
++ ++ネストされた `for` ループで、同じリストをもう一度繰り返しますが、今回は別の変数名(`coordinate2`)を使用します。 ++
++ +diff -Naur "a/Loops/While loop/task.md" "b/Loops/While loop/task.md" +--- "a/Loops/While loop/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Loops/While loop/task.md" 2022-04-09 23:02:37.722575075 +0900 +@@ -0,0 +1,12 @@ ++## while ループ :(while loop) ++ ++`while` ループは `if` ステートメントにいくぶん似ています: ある条件が `True` の場合にコードを実行します。 ++主な違いは、条件が `True` である限り、インデントされたコードを実行し続けることです。 ++ ++式が `False` の場合、ループは終了します。 ++ ++ `1` から `9` `(1, 4, ... , 81)` までのすべての正方形を出力します。 ++`while` ループで `number` 変数を使用します。 ++ ++
条件で number が厳密に10未満であることを確認してください。
++ +diff -Naur "a/Modules and packages/Built-in modules/task.md" "b/Modules and packages/Built-in modules/task.md" +--- "a/Modules and packages/Built-in modules/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Modules and packages/Built-in modules/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,30 @@ ++## 内蔵モジュール :(Built-in modules) ++ ++Python には、[標準モジュールのライブラリ](https://docs.python.org/3/library/) が付属しています。 ++ ++一部のモジュールはインタープリタに組み込まれています。これらは、言語のコアの一部ではないが、効率のため、またはシステムコールなどのオペレーティングシステム プリミティブへのアクセスを提供するために組み込まれている操作へのアクセスを提供します。 ++ ++1つの特定のモジュールは注意に値します: `sys` 。これはすべての Python インタープリターに組み込まれています。 ++ ++変数 ` sys.ps1` および `sys.ps2` は、インタプリタがインタラクティブモードの場合にプライマリおよびセカンダリプロンプトとして使用される文字列を定義します: ++ ++```text ++>>> import sys ++>>> sys.ps1 ++'>>> ' ++>>> sys.ps2 ++'... ' ++``` ++ ++変数 `sys.path` は、モジュールのインタープリタの検索パスを決定する文字列のリストです。 ++課題のコードを実行すると何が出力されるか、を確認してください。 ++ ++&shortcut :CodeCompletion; (コード補完機能)を使用できることを忘れないでください: ++ドット (.) の後に、モジュールの使用可能なメソッドを調べます。 ++ ++標準モジュールの詳細については、こちら をご覧ください。 ++ ++インポートされた組み込みモジュール `datetime` を使用して現在の日付を出力します。 ++ ++
datetime.datetime.today() 関数を使用します。
++ +diff -Naur "a/Modules and packages/Executing modules as scripts/task.md" "b/Modules and packages/Executing modules as scripts/task.md" +--- "a/Modules and packages/Executing modules as scripts/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Modules and packages/Executing modules as scripts/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,66 @@ ++## モジュールをスクリプトとして実行します :(Executing modules as scripts) ++ ++Python モジュールは、実行可能ステートメントと関数またはクラスの定義を含むファイルです。 ++ ++これらのステートメントは、`import` ステートメントでモジュール名が最初に検出されたときに実行されます。 ++ファイル名は、接尾辞 .py が追加されたモジュール名です。 ++ ++モジュール内では、モジュールの名前(文字列として)は、グローバル変数 `__name__` の値として使用できます。 ++ ++モジュールを**直接**(つまり、別のモジュールにインポートすることなく)実行すると、 ++モジュール内のコードは、インポートした場合と同じように実行されますが、 ++ `__name__` は `"__main__"` に設定されています。 ++ ++次のように `__name__` と `__main__` を使用できます: ++ ++```python ++if __name__ == "__main__": ++ # Do something here ++``` ++ ++このブロック内のステートメントは、モジュールが直接実行され、別のモジュールへのインポートを介さない場合にのみ実行されます。例えば、2つのファイルについて考えてみましょう: ++ ++main_program: ++```python ++import some_module ++ ++print(f"main_program __name__ is: {__name__}") ++ ++if __name__ == "__main__": ++ print("main_program executed directly") ++else: ++ print("main_program executed when imported") ++``` ++ ++some_module: ++```python ++print(f"some_module __name__ is: {__name__}") ++ ++if __name__ == "__main__": ++ print("some_module executed directly") ++else: ++ print("some_module executed when imported") ++``` ++ ++`main_program` を実行した後の出力: ++```text ++some_module __name__ is: some_module ++some_module executed when imported ++main_program __name__ is: __main__ ++main_program executed directly ++``` ++ ++`some_module` を実行した後の出力: ++```text ++some_module __name__ is: __main__ ++some_module executed directly ++``` ++`task.py`と`some_module.py`を変更して、task.py を実行したときに出力が次のようになるようにします: ++ ++```text ++This is a message from some_module. ++This is a message from __main__. ++This is a message from the function in the imported module. ++This should be printed ONLY when task.py is called directly. ++``` ++ +diff -Naur "a/Modules and packages/From import/task.md" "b/Modules and packages/From import/task.md" +--- "a/Modules and packages/From import/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Modules and packages/From import/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,44 @@ ++## インポート :(from import) ++ ++import ステートメントの 1つの形式は、`from` の名前でモジュールから直接インポートします。 ++このようにして、インポートされた `module_name` をプレフィックスなしで使用できます。 ++ ++例えば: ++ ++```python ++from calculator import Add ++ ++calc = Add() # name `Add` used directly without prefix `calculator` ++``` ++ ++これは、インポートが取得されるモジュールの名前をローカルシンボルテーブルに導入しません(したがって、この例では、 `calculator` は定義されていません)。 ++ ++モジュールが定義するすべての名前をインポートするオプションもあります: ++ ++```python ++from calculator import * ++calc = Multiply() ++``` ++ ++これにより、アンダースコア`_`で始まる名前を除くすべての名前がインポートされます。 ++ほとんどの場合、Python プログラマーはこれを使用しません。 ++これは、未知の名前のセットをインタープリターに導入し、既に定義したものを隠す可能性があるためです。 ++ ++モジュール名の後に `as` が続く場​​合、`as` に続く名前はインポートされたモジュールに直接バインドされます: ++ ++```python ++import my_module as mm ++mm.hello_world() ++``` ++ ++これは、 `import my_module` が行うのと同じ方法でモジュールを効果的にインポートしますが、唯一の違いは `mm` として使用できることです。同様の効果を持つ `from` を利用する場合にも使用できます: ++ ++```python ++from calculator import Subtract as Minus ++``` ++ ++`calculator` から `Calculator` クラスをインポートし、このクラスのインスタンスを作成します。 ++この場合、正しくアクセスする方法を覚えておいてください: ++ ++
注: この Calculator クラスは、直接インポートしたので、プレフィックスなしで呼び出す必要があります。
++ +diff -Naur "a/Modules and packages/Import module/task.md" "b/Modules and packages/Import module/task.md" +--- "a/Modules and packages/Import module/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Modules and packages/Import module/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,29 @@ ++## インポート モジュール :(Import module) ++ ++プログラムが長くなると、メンテナンスを容易にするために、プログラムをいくつかのファイルに分割することをお勧めします。また、いくつかのプログラムで定義をコピーせずに、いくつかのプログラムで作成した便利な関数を使用することもできます。 ++ ++Python のモジュールは、Python の定義とステートメントを含む `.py` 拡張子を持つ単純な Python ファイルです。 ++ ++モジュールは、`import` キーワードと拡張子 `.py` のないファイル名を使用して他のモジュールからインポートされます。 ++ ++一連の関数( `func1`、` func2` など)を含む `my_funcs.py` というスクリプトを作成したとします。 ++これで、同じディレクトリに配置されている別のスクリプトでそれらを使用する場合は、`import my_funcs` を実行できます。 ++ ++これは、 `my_funcs` で定義された関数の名前を直接インポートしませんが、モジュール名を使用して、次のように関数にアクセスできるようになります: ++ ++```python ++my_funcs.func1() ++``` ++モジュールは他のモジュールをインポートできます。 ++慣例で行われていますが、すべてのインポートステートメントをモジュールの先頭に配置する必要はありません。 ++ ++Python チュートリアルの [このセクション](https://docs.python.org/3/tutorial/modules.html) を読むと、Python のモジュールについて詳しく知ることができます。 ++ ++コードエディタで、モジュール `calculator` をインポートし、クラス `Calculator` (`calc`) のインスタンスを作成します。 ++ ++ループ内の `Calculator` で定義された `add` メソッドを使用して、0 から 99 までの数値を合計します。 ++ ++
import キーワードと calculator リファレンスを使用します。
++
module.function() などの構文を使用して、モジュールから関数にアクセスします。
++
関数に引数を指定することを忘れないでください。
++ +diff -Naur "a/Modules and packages/Packages/task.md" "b/Modules and packages/Packages/task.md" +--- "a/Modules and packages/Packages/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Modules and packages/Packages/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,47 @@ ++## パッケージ :(Packages) ++ ++パッケージは、「点線のモジュール名」を使用してPython のモジュール名前空間を構造化する方法です。 ++ ++例えば、モジュール名 `A.B` は、`A` という名前のパッケージ内の `B` という名前のサブモジュールを指定します。 ++ ++モジュールを使用することで、さまざまなモジュールの作成者が互いのグローバル変数名について心配する必要がなくなるのと同様に、点線のモジュール名を使用すると、[NumPy](https://numpy.org/) のようなマルチモジュールパッケージの作成者を省略できます。または [Pillow](https://pypi.org/project/Pillow/) は、互いのモジュール名を気にする必要がありません。 ++ ++__init__.py ファイルは、Python でファイルを含むディレクトリをパッケージとして処理するために必要です。これにより、 string などの一般名のディレクトリが、モジュール検索パスの後半で発生する歪んだモジュールを意図せずに非表示にするのを防ぎます。最も単純なケースでは、__init__.py は空のファイルにすることができます。 ++ ++私たちが作成したパッケージ `functions` と `classes` をチェックしてください。 ++パッケージのユーザーは、パッケージから個々のモジュールをインポートできます。 ++ ++例を示します: ++ ++```python ++import functions.greeting.hello ++``` ++ ++これにより、サブモジュール `functions.greeting.hello` がロードされます。フルネームで参照する必要があります: ++ ++```python ++functions.greeting.hello.hello('Susan') ++``` ++ ++サブモジュールをインポートする別の方法は次のとおりです: ++ ++```python ++from functions.greeting import hello ++``` ++ ++これにより、サブモジュール `hello` もロードされ、パッケージプレフィックスなしで使用できるようになるため、次のように使用できます: ++ ++```python ++hello.hello('Susan') ++``` ++パッケージの詳細については、Python ドキュメントの このページ をご覧ください。 ++ ++コードエディタで、 `official` モジュールを適切にインポートして、最後の `print` ステートメントを機能させます。 ++ ++2番目の print ステートメントで、関数呼び出しを追加して(適切な関数を見つけて)、`'Alex'` に別れを告げます。 ++ ++
package.subpackage.module などの構文を使用してモジュールにアクセスします。
++
import module as something などの構文を使用します。
++
インポートを確認してください: 2番目の課題に適切な機能を備えている可能性のあるインポートがあります。 ++使用するときは注意してください。モジュールはすでに特定の名前でインポートされています。
++ +diff -Naur a/README.md b/README.md +--- a/README.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/README.md 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,12 @@ ++# 「Introduction to Python」コースの紹介(教育製品バージョン)[![official JetBrains project](http://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) ++ ++

これは、JetBrains Educational Products によるPython の入門コースです。 ++対象読者は、プログラミングの経験がほとんどまたはまったくない、Python の学習を開始したい人々です。

++ ++

このコースでは、変数とその操作、文字列とその他のデータ構造、ブール演算子、条件、制御フローなどの基本について学習します。ループ、関数、クラスを実装し、コードの一部をインポートされたモジュールとして使用し、テキストファイルを操作してみます。

++ ++

楽しんで頑張ってください!

++ ++

P.S. 貢献したいですか?このコースにプルリクエストを送信してください ++git リポジトリ.

++ +diff -Naur "a/Strings/Basic string methods/task.md" "b/Strings/Basic string methods/task.md" +--- "a/Strings/Basic string methods/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/Basic string methods/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,17 @@ ++## 基本的な文字列メソッド :(Basic string methods) ++ ++多くの便利な文字列メソッドがあります。 ++ ++例えば、 `lower()` メソッドを使用して、文字列の大文字と小文字を削除できます。 ++`upper()` メソッドは、文字列を大文字にするために使用されます。 ++ ++文字列メソッドを呼び出すには、文字列(または文字列を含む変数)の後にドットを入力し、その後にメソッド名を入力します。(例: `"John".upper()`) ++ ++PyCharm では、ドットを入力した後のショートカット( &shortcut:CodeCompletion; )を使用して、使用可能なすべての文字列メソッドを調べることができます。 ++ ++すべての文字列メソッドの詳細については、こちら をご覧ください。 ++ ++適切な文字列メソッドを使用して、大文字で `monty_python` を出力します。 ++ ++
コードで lower() メソッドがどのように使用されているかに注意してください。
++ +diff -Naur "a/Strings/Character escaping/task.md" "b/Strings/Character escaping/task.md" +--- "a/Strings/Character escaping/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/Character escaping/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,34 @@ ++## キャラクターエスケープ :(Character escaping) ++ ++バックスラッシュは、一重引用符や二重引用符などの特殊記号をエスケープするために使用されます。 ++ ++例えば、`"It\'s me"`(それは私です)、または `"She said \"Hello\""` (彼女は「こんにちは」と言った)などです。 ++ ++文字列の一部として実際に \\ 文字を入力する必要がある場合は、それもエスケープする必要があります。 ++ ++例えば、単一の円記号を印刷する方法は次のとおりです: ++ ++```python ++print('\\') ++``` ++ ++特殊記号 `'\n'` は文字列に「改行」を追加するために使用され、`'\t'` は「集計」を意味します。 ++ ++引用符には特別な意味があり、バックスラッシュを使用してエスケープすることもできます。 ++ ++文字列内に引用符を印刷する必要がある場合は、別の種類の引用符を使用してください。 ++ ++二重引用符で囲まれた文字列では、エスケープせずに一重引用符を使用できます。その逆も可能です。 ++ ++また、補足として、お気に入りの種類の引用符を選び、それらを一貫して使用することをお勧めします。 ++ ++エスケープの詳細については、Pythonドキュメントの このセクション をご覧ください。 ++ ++1つの文字列を使用して次のテキストを出力します: ++ ++```text ++The name of this ice cream is "Sweet'n'Tasty" ++``` ++ ++
バックスラッシュを使用して引用符をエスケープします。
++ +diff -Naur a/Strings/Concatenation/task.md b/Strings/Concatenation/task.md +--- a/Strings/Concatenation/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Strings/Concatenation/task.md 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,10 @@ ++## 連結 :(Concatenation) ++ ++一部の算術演算は非数値型にも適用できることを覚えていますか? ++ ++`+` 記号を使用して 2つの文字列を組み合わせると、「連結」と呼ばれます。 ++ ++`hello` 変数と `world` 変数を使用して、文字列 `"Hello World"` を取得します。 ++ ++
連鎖連結と単一スペース文字列 " " を使用します。
++ +diff -Naur a/Strings/F-strings/task.md b/Strings/F-strings/task.md +--- a/Strings/F-strings/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Strings/F-strings/task.md 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,36 @@ ++## フォーマットされた文字列リテラル :(Formatted string literals) ++ ++フォーマットされた文字列リテラル、または Fストリング (f-string) は、接頭辞 'f' または 'F' が付いた文字列リテラルです。これらの文字列には、中括弧 `{}` で区切られた式である置換フィールドが含まれる場合があります。 ++ ++中括弧の外側の文字列の部分は文字通り扱われます。 ++エスケープシーケンスは、通常の文字列リテラルのようにデコードされます。 ++置換式には改行を含めることができますが(トリプルクォート文字列など)、コメントを含めることはできません。 ++各式は、フォーマットされた文字列リテラルが表示されるコンテキストで、左から右の順に評価されます。 ++ ++いくつかの例を示します: ++ ++```python ++name = "Fred" ++f"He said his name is {name}." ++``` ++```text ++'He said his name is Fred.' ++``` ++ ++例えば、Fストリングで実行できるよりも凝ったことができます: ++ ++```python ++f"{name.lower()} is funny." ++``` ++ ++```text ++'fred is funny.' ++``` ++ ++フォーマットされた文字列リテラルの詳細については、 Python Docs を参照してください。 ++ ++自分で、Fストリングを作成してみてください。 ++また、コードを実行して、何が出力されるかを確認してください。 ++ ++
name 変数に割り当てられる値は文字列である必要があるため、'Max' のように引用符で囲む必要があります。
++ +diff -Naur "a/Strings/In operator/task.md" "b/Strings/In operator/task.md" +--- "a/Strings/In operator/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/In operator/task.md" 2022-04-09 23:02:37.734575202 +0900 +@@ -0,0 +1,8 @@ ++## In 演算子 :(In operator) ++ ++文字列に特定の文字または部分文字列が含まれているかどうかを確認する場合は、`in` キーワードを使用できます。 ++ ++`"ice cream"`(アイスクリーム)に `"ice"`(アイス)があるかどうかを確認し、結果を変数 `contains` に割り当てます。 ++ ++
in 演算子を使用します。
++ +diff -Naur "a/Strings/String formatting/task.md" "b/Strings/String formatting/task.md" +--- "a/Strings/String formatting/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/String formatting/task.md" 2022-04-09 23:02:37.730575159 +0900 +@@ -0,0 +1,16 @@ ++## 文字列のフォーマット :(String formatting) ++ ++文字列の後の`%`演算子は、文字列を変数と組み合わせるために使用されます。 ++`%` 演算子は、文字列内の `%s` をその後に続く文字列変数に置き換えます。 ++`%d` 特殊記号は、数値または 10進値のプレースホルダーとして使用されます。 ++ ++> : ここで説明する書式設定操作には、さまざまな癖があり、多くの一般的なエラーが発生します。 ++> 新しい形式の文字列リテラル([さらに](course://Strings/F-strings) を参照)を使用して、str.format() インターフェース、 ++> または テンプレート文字列は、これらのエラーを回避するのに役立つ場合があります。 ++> これらの選択肢はそれぞれ、単純さ、柔軟性、および拡張性という独自のトレードオフと利点を提供します。 ++ ++PyCharm にあなたが何歳かを伝えます(数字を使用)。 ++ ++
%d 特殊記号を使用します。
++
あなたは何歳ですか?
++ +diff -Naur "a/Strings/String indexing/task.md" "b/Strings/String indexing/task.md" +--- "a/Strings/String indexing/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/String indexing/task.md" 2022-04-09 23:02:37.734575202 +0900 +@@ -0,0 +1,17 @@ ++## 文字列のインデックス作成 :(String indexing) ++ ++文字列の位置がわかっている場合は、文字列内の文字にアクセスできます。 ++ ++例えば、 `str[index]` は、文字列 `str` の位置 `index` にある文字を生成します。 ++ ++文字列のインデックス作成は常に `0` から始まることに注意してください。 ++文字列に `x` が見つからない場合、`index` は `ValueError` を発生させます。 ++ ++右から(つまり、文字列の終わりから)カウントを開始する必要がある場合は、インデックスが負の数になることもあります。 ++ ++`-0` は `0` と同じであるため、負のインデックスは `-1` から始まることに注意してください。 ++ ++インデックス演算子を使用して、`"Python"` から文字 `"P"` を取得します。 ++ ++
インデックスは 0 で始まることに注意してください。
++ +diff -Naur "a/Strings/String length/task.md" "b/Strings/String length/task.md" +--- "a/Strings/String length/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/String length/task.md" 2022-04-09 23:02:37.734575202 +0900 +@@ -0,0 +1,11 @@ ++## 文字列の長さ :(String length) ++ ++`len()` メソッドは、文字列に含まれる文字数をカウントするために使用されます。 ++ ++変数 `phrase` に格納されている文字列の前半を取得します。 ++注: インデックスを取得するときは、型変換について覚えておいてください。 ++ ++
文字列の最初から中間点までのスライスを取得する必要があります。
++ ++
文字列の長さを 2で割って、中間のインデックスを取得します。除算の結果は整数である必要があります。
++ +diff -Naur "a/Strings/String multiplication/task.md" "b/Strings/String multiplication/task.md" +--- "a/Strings/String multiplication/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/String multiplication/task.md" 2022-04-09 23:02:37.734575202 +0900 +@@ -0,0 +1,13 @@ ++## 文字列の乗算 :(String multiplication) ++ ++Python は、文字列ごとの乗算もサポートしています(ただし、その逆はサポートされていません)。 ++ ++`not_yet_food` 変数を使用して、`food` 変数に保存されている食品名を取得します。 ++ ++
++ ++`"クス"`を`2`回繰り返すと`"クスクス"`になります。 ++
++ ++
乗算を使用します。
++ +diff -Naur "a/Strings/String negative indexing/task.md" "b/Strings/String negative indexing/task.md" +--- "a/Strings/String negative indexing/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/String negative indexing/task.md" 2022-04-09 23:02:37.734575202 +0900 +@@ -0,0 +1,8 @@ ++## 文字列の負のインデックス :(String negative indexing) ++ ++すでに述べたように、負のインデックスを使用して、文字列の末尾から「逆方向」に文字をカウントできます。 ++ ++負のインデックスを使用して、`long_string` から `'!'` 記号を取得します。 ++ ++
負のインデックスを使用します。
++ +diff -Naur "a/Strings/String slicing/task.md" "b/Strings/String slicing/task.md" +--- "a/Strings/String slicing/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Strings/String slicing/task.md" 2022-04-09 23:02:37.734575202 +0900 +@@ -0,0 +1,32 @@ ++## スライス :(Slicing) ++ ++スライスは、文字列から複数の文字(サブ文字列)を抽出するために使用されます。 ++ ++その構文はインデックス作成の構文と似ていますが、1つのインデックスの代わりに、コロンで区切られた 2つのインデックス(数値)を使用します。(例: `str[ind1:ind2]`) ++ ++これらの 2つのインデックスは、部分文字列の開始と終了に対応します。 ++インデックスが `ind1` のシンボルは含まれますが、インデックスが `ind2` のシンボルは含まれないことに注意してください。 ++ ++Pythonでスライスがどのように機能するかを視覚的に示します: ++ ++ ++```text +++---+---+---+---+---+---+ ++| P | y | t | h | o | n | +++---+---+---+---+---+---+ ++0 1 2 3 4 5 6 ++-6 -5 -4 -3 -2 -1 ++``` ++ ++##### 例: ++

++str[start:end] # アイテムは最初から最後-1まで
++str[start:]    # アイテムは配列の残りの部分から始まります
++str[:end]      # 最初から最後-1 までのアイテム
++str[:]         # 配列全体のコピー
++
++ ++スライスを使用して、`monty_python` 変数から `"Python"` を取得します。 ++ ++
インデックスの 1つを空のままにしておくことができます。
++ +diff -Naur "a/Variables/Arithmetic operators/task.md" "b/Variables/Arithmetic operators/task.md" +--- "a/Variables/Arithmetic operators/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Variables/Arithmetic operators/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,39 @@ ++## 算術演算子 :(Arithmetic operators) ++ ++他のプログラミング言語と同じように、加算( `+` )、減算( `-` )、 ++乗算( `*` )および除算( `/` )演算子は、数値とともに使用できます。 ++さらに、Python には、累乗( `**` )、モジュロ( `%` )、およびフロア分割(`//` )演算子があります。 ++ ++- `*`(乗算)演算子は、その引数の積を生成します。 ++引数は両方とも数値であるか、一方の引数が整数でもう一方がシーケンスである必要があります。 ++ ++- `/`(除算)および `//`(床除算)演算子は、引数の商を生成します。 ++整数の除算はfloatを生成し、整数のフロア除算は整数を生成します。 ++ ++- `%`(モジュロ)演算子は、最初の引数を2番目の引数で除算した余りを返します。 ++ ++- `+`(加算)演算子は、その引数の合計を生成します。 ++引数は、両方が数値であるか、両方が同じタイプのシーケンスである必要があります。 ++ ++- `-`(減算)演算子は、その引数の差を生成します。 ++ ++2進算術演算には、従来の優先度レベルがあります。 ++これらの操作の一部は、特定の非数値タイプにも適用されることに注意してください。 ++ ++このトピックの詳細については、こちらをご覧ください。 ++ ++### 課題 ++- `number` に格納されている値を `2` で割ります。 ++- そのような除算の余りを計算します。 ++- 除算結果に `2` を掛けます。 ++- 除算の余りを乗算結果に追加します。 ++- 数値から乗算結果を減算します。 ++- `number` を 2 でフロア分割します。 ++- `multiplication_result` を 3 の累乗に上げます。 ++ ++
まず、/ 演算子を使用します。
++
次に、% 演算子を使用します。
++
次に、* 演算子を使用します。
++
次に、+ 演算子を使用します。
++
次に、- 演算子を使用します。
++ +diff -Naur a/Variables/Assignments/task.md b/Variables/Assignments/task.md +--- a/Variables/Assignments/task.md 1970-01-01 09:00:00.000000000 +0900 ++++ b/Variables/Assignments/task.md 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,12 @@ ++## 割り当て :(Assignments) ++ ++拡張代入は、二項演算と代入ステートメントを組み合わせた単一のステートメントです( `+=`、 `-=` など)。 ++ ++`x += 1` のような拡張代入式は、`x = x + 1` と書き直して、同様の効果を得ることができます。 ++この こちら について詳しく読むことができます。 ++ ++### 課題 ++拡張代入を使用して `5` を `number` に追加し、変数を更新します。 ++ ++
+= 演算子を使用します。
++ +diff -Naur "a/Variables/Boolean operators/task.md" "b/Variables/Boolean operators/task.md" +--- "a/Variables/Boolean operators/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Variables/Boolean operators/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,14 @@ ++## ブール演算子 :(Boolean operators) ++ ++ブール値は、`True`または`False`のみが可能な値のタイプです。 ++ `==`(等式)演算子は 2つの変数を比較し、それらが等しいかどうかをチェックします。 ++ ++### 課題 ++- 変数 `two` が `three` と等しいかどうかを確認します。 ++- 変数 `is_equal` に不正な名前が付いているかどうかを確認します。 ++- 変数 `is_false` に実際に嘘が含まれているかどうかを確認します。 ++ ++
== 演算子を使用します。
++
True 値を使用します。
++
False 値を使用します。
++ +diff -Naur "a/Variables/Comparison operators/task.md" "b/Variables/Comparison operators/task.md" +--- "a/Variables/Comparison operators/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Variables/Comparison operators/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,38 @@ ++## 比較演算子 :(Comparison operators) ++ ++Python には、次のような多くの種類の比較演算子があります: ++ ++- `<` 未満 ++ ++- `>` より大きい ++ ++- `==` 等しい ++ ++- `>=` 以上 ++ ++- `<=` 以下 ++ ++- `!=` 等しくない ++ ++演算子は、2つのオブジェクトの値を比較します。 ++オブジェクトは同じタイプである必要はありません。 ++ ++Python のすべての比較演算の優先度は同じであり、算術演算、シフト演算、またはビット演算の優先度よりも低くなっています。比較すると、ブール値(`True` または `False`)が生成されます。 ++ ++比較は任意に連鎖させることができ、`a こちら をご覧ください。 ++ ++### 課題 ++- 変数 `three` の値が変数 `two` の値よりも厳密に大きいかどうかを確認します。 ++- 変数 `one` の値が変数 `three` の値よりも厳密に小さいかどうかを確認します。 ++- 変数 `three` の値が、変数 `two` の値と変数 `one` の値の両方よりも厳密に大きいかどうかを確認します。 ++- 変数 `one` が変数 `two` と等しくないかどうかを確認します。 ++- 変数 `thee` がそれ自体と等しいかどうかを確認します。 ++ ++
> 演算子を使用します。
++
< 演算子を使用します。
++
> 演算子と < 演算子の両方を使用します。
++
!=演算子を使用します。
++
== 演算子を使用します。
++ +diff -Naur "a/Variables/Type conversion/task.md" "b/Variables/Type conversion/task.md" +--- "a/Variables/Type conversion/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Variables/Type conversion/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,15 @@ ++## 型変換 :(Type conversion) ++ ++あるデータ型を別のデータ型に変換できる組み込み関数がいくつかあります。 ++これらの関数は、変換された値を表す新しいオブジェクトを返します。 ++ ++`int(x)` は `x` を整数に変換します。 ++`float(x)` は `x` を浮動小数点数に変換します。 ++ `str(x)` は、オブジェクト `x` を文字列表現に変換します。 ++ ++### 課題 ++ ++`float_number` を整数に変換します。 ++ ++
int() 関数を使用します。
++ +diff -Naur "a/Variables/Undefined variable/task.md" "b/Variables/Undefined variable/task.md" +--- "a/Variables/Undefined variable/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Variables/Undefined variable/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,39 @@ ++## 算術演算子 :(Arithmetic operators) ++ ++他のプログラミング言語と同じように、加算( `+` )、減算( `-` )、 ++乗算( `*` )および除算( `/` )演算子は、数値とともに使用できます。 ++さらに、Python には、累乗( `**` )、モジュロ( `%` )、およびフロア分割(`//` )演算子があります。 ++ ++- `*`(乗算)演算子は、その引数の積を生成します。 ++引数は両方とも数値であるか、一方の引数が整数でもう一方がシーケンスである必要があります。 ++ ++- `/`(除算)および `//`(床除算)演算子は、引数の商を生成します。 ++整数の除算はfloatを生成し、整数のフロア除算は整数を生成します。 ++ ++- `%`(モジュロ)演算子は、最初の引数を 2番目の引数で除算した余りを返します。 ++ ++- `+`(加算)演算子は、その引数の合計を生成します。 ++引数は、両方が数値であるか、両方が同じタイプのシーケンスである必要があります。 ++ ++- `-`(減算)演算子は、その引数の差を生成します。 ++ ++2進算術演算には、従来の優先度レベルがあります。 ++これらの操作の一部は、特定の非数値タイプにも適用されることに注意してください。 ++ ++このトピックの詳細については、こちらをご覧ください。 ++ ++### 課題 ++- `number` に格納されている値を `2` で割ります。 ++- そのような除算の余りを計算します。 ++- 除算結果に `2` を掛けます。 ++- 除算の余りを乗算結果に追加します。 ++- 数値から乗算結果を減算します。 ++- `number` を 2 でフロア分割します。 ++- `multiplication_result` を 3 の累乗に上げます。 ++ ++
まず、/ 演算子を使用します。
++
次に、% 演算子を使用します。
++
次に、* 演算子を使用します。
++
次に、+ 演算子を使用します。
++
次に、- 演算子を使用します。
++ +diff -Naur "a/Variables/Variable definition/task.md" "b/Variables/Variable definition/task.md" +--- "a/Variables/Variable definition/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Variables/Variable definition/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,13 @@ ++## 変数の定義 :(Variable definition) ++ ++変数は値を格納するために使用されるため、後で参照できます。 ++変数はラベルのようなものであり、Python では、代入演算子と呼ばれる '` =`' 記号を使用して、変数に値を割り当てます。 ++ ++割り当ては連鎖させることができます。(例: `a = b = 2`) ++ ++### 課題 ++- 変数 `greetings` に格納されている値を変更します。 ++- チェーン代入を使用して、`a` と `b` の両方に 2 を格納します。 ++ ++
回答プレースホルダーに新しい値を入力します。
++ +diff -Naur "a/Variables/Variable types/task.md" "b/Variables/Variable types/task.md" +--- "a/Variables/Variable types/task.md" 1970-01-01 09:00:00.000000000 +0900 ++++ "b/Variables/Variable types/task.md" 2022-04-09 23:02:37.738575244 +0900 +@@ -0,0 +1,28 @@ ++## 変数タイプ :(Variable types) ++ ++Python プログラムのすべてのデータは、オブジェクトまたはオブジェクト間の関係によって表されます。 ++ ++すべてのオブジェクトには、ID、タイプ、および値があります。 ++オブジェクトのID は、一度作成されると変更されることはありません。 ++これは、メモリ内のオブジェクトのアドレスと考えることができます。 ++ ++オブジェクトの `type` は、サポートする操作を決定し(たとえば、「長さはありますか?」)、そのタイプのオブジェクトに可能な値を定義します。 ++ ++`type()` 関数は、オブジェクトの型(オブジェクト自体)を返します。 ++そのアイデンティティと同様に、オブジェクトのタイプも変更できません。 ++ ++一部のオブジェクトの値は変更される可能性があります。 ++値が変更される可能性のあるオブジェクトは mutable(可変)です。 ++作成後に値が変更できないオブジェクトは immutable(不変)と呼ばれます。 ++ ++Python には、整数と浮動小数点数の 2つの主要なタイプの数値があります。 ++それらの最も重要な違いは、`float` は小数点のある数値であり、`int` は小数点のない数値であることです。 ++ ++このトピックの詳細については、Python ドキュメントの "オブジェクト、値、およびタイプ" と "標準の型階層" のセクションを参照してください。 ++ ++### 課題 ++変数 `float_number` の型を出力します。 ++ ++
++2行目の number のタイプをどのように決定したかを確認し、float_number でも同じことを行います。
++ diff --git a/Translations/screenshot-ja.jpg b/Translations/screenshot-ja.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e7be489b37d040e853d6add4fa63ee6aa6692b5e GIT binary patch literal 70186 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ⅆ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