@@ -1015,30 +1015,70 @@ <h3 id="sortable">Sortable</h3>
1015
1015
< span class ="hljs-keyword "> return</ span > self.a < other.a
1016
1016
< span class ="hljs-keyword "> return</ span > < span class ="hljs-built_in "> NotImplemented</ span >
1017
1017
</ code > </ pre >
1018
+ < h3 id ="iterable "> Iterable</ h3 >
1019
+ < ul >
1020
+ < li > < strong > Only required method for iterable is iter(), that should return an iterator of its contents.</ strong > </ li >
1021
+ </ ul >
1022
+ < pre > < code class ="python language-python hljs "> < span class ="hljs-class "> < span class ="hljs-keyword "> class</ span > < span class ="hljs-title "> MyIterable</ span > :</ span >
1023
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __init__</ span > < span class ="hljs-params "> (self, a)</ span > :</ span >
1024
+ self.a = a
1025
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __iter__</ span > < span class ="hljs-params "> (self)</ span > :</ span >
1026
+ < span class ="hljs-keyword "> for</ span > el < span class ="hljs-keyword "> in</ span > self.a:
1027
+ < span class ="hljs-keyword "> yield</ span > el
1028
+ </ code > </ pre >
1018
1029
< h3 id ="collection "> Collection</ h3 >
1019
1030
< ul >
1020
- < li > < strong > Methods do not depend on each other, so they can be skipped if not needed.</ strong > </ li >
1021
- < li > < strong > Any object with defined getitem() is considered iterable, even if it lacks iter().</ strong > </ li >
1031
+ < li > < strong > Every collection is also an iterable.</ strong > </ li >
1032
+ < li > < strong > This cheatsheet actually means < code class ="python hljs "> < span class ="hljs-string "> '<iterable>'</ span > </ code > when it uses < code class ="python hljs "> < span class ="hljs-string "> '<collection>'</ span > </ code > .</ strong > </ li >
1033
+ < li > < strong > I chose not to use the name iterable because it sounds scarier and more vague than collection.</ strong > </ li >
1022
1034
</ ul >
1023
1035
< pre > < code class ="python language-python hljs "> < span class ="hljs-class "> < span class ="hljs-keyword "> class</ span > < span class ="hljs-title "> MyCollection</ span > :</ span >
1024
1036
< span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __init__</ span > < span class ="hljs-params "> (self, a)</ span > :</ span >
1025
1037
self.a = a
1038
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __iter__</ span > < span class ="hljs-params "> (self)</ span > :</ span >
1039
+ < span class ="hljs-keyword "> for</ span > el < span class ="hljs-keyword "> in</ span > self.a:
1040
+ < span class ="hljs-keyword "> yield</ span > el
1026
1041
< span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __len__</ span > < span class ="hljs-params "> (self)</ span > :</ span >
1027
1042
< span class ="hljs-keyword "> return</ span > len(self.a)
1028
- < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __getitem__</ span > < span class ="hljs-params "> (self, i)</ span > :</ span >
1029
- < span class ="hljs-keyword "> return</ span > self.a[i]
1030
- < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __setitem__</ span > < span class ="hljs-params "> (self, i, el)</ span > :</ span >
1031
- self.a[i] = el
1032
1043
< span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __contains__</ span > < span class ="hljs-params "> (self, el)</ span > :</ span >
1033
1044
< span class ="hljs-keyword "> return</ span > el < span class ="hljs-keyword "> in</ span > self.a
1034
- < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __iter__</ span > < span class ="hljs-params "> (self)</ span > :</ span >
1035
- < span class ="hljs-keyword "> for</ span > el < span class ="hljs-keyword "> in</ span > self.a:
1036
- < span class ="hljs-keyword "> yield</ span > el
1037
1045
</ code > </ pre >
1038
- < pre > < code class ="python language-python hljs "> < span class ="hljs-meta "> >>> </ span > < span class ="hljs-keyword "> from</ span > collections.abc < span class ="hljs-keyword "> import</ span > Sequence, Collection, Iterable
1039
- < span class ="hljs-meta "> >>> </ span > a = MyCollection([< span class ="hljs-number "> 1</ span > , < span class ="hljs-number "> 2</ span > , < span class ="hljs-number "> 3</ span > ])
1040
- < span class ="hljs-meta "> >>> </ span > isinstance(a, Sequence), isinstance(a, Collection), isinstance(a, Iterable)
1041
- (< span class ="hljs-keyword "> False</ span > , < span class ="hljs-keyword "> True</ span > , < span class ="hljs-keyword "> True</ span > )
1046
+ < h3 id ="sequence "> Sequence</ h3 >
1047
+ < ul >
1048
+ < li > < strong > Every sequence is also an iterable.</ strong > </ li >
1049
+ < li > < strong > That is because iter() is automatically generated if getitem() is defined.</ strong > </ li >
1050
+ </ ul >
1051
+ < pre > < code class ="python language-python hljs "> < span class ="hljs-class "> < span class ="hljs-keyword "> class</ span > < span class ="hljs-title "> MySequence</ span > :</ span >
1052
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __init__</ span > < span class ="hljs-params "> (self, a)</ span > :</ span >
1053
+ self.a = a
1054
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __len__</ span > < span class ="hljs-params "> (self)</ span > :</ span >
1055
+ < span class ="hljs-keyword "> return</ span > len(self.a)
1056
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __getitem__</ span > < span class ="hljs-params "> (self, i)</ span > :</ span >
1057
+ < span class ="hljs-keyword "> return</ span > self.a[i]
1058
+ </ code > </ pre >
1059
+ < h3 id ="collectionsabcsequence "> Collections.abc.Sequence</ h3 >
1060
+ < ul >
1061
+ < li > < strong > A much richer interface than the basic sequence.</ strong > </ li >
1062
+ < li > < strong > Extending it generates contains(), iter(), reversed(), index(), and count().</ strong > </ li >
1063
+ < li > < strong > It is not a duck type, so < code class ="python hljs "> < span class ="hljs-string "> 'issubclass(MySequence, collections.abc.Sequence)'</ span > </ code > would return 'False' even if it had all the methods defined.</ strong > </ li >
1064
+ </ ul >
1065
+ < pre > < code class ="python language-python hljs "> < span class ="hljs-class "> < span class ="hljs-keyword "> class</ span > < span class ="hljs-title "> MyAbcSequence</ span > < span class ="hljs-params "> (collections.abc.Sequence)</ span > :</ span >
1066
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __init__</ span > < span class ="hljs-params "> (self, a)</ span > :</ span >
1067
+ self.a = a
1068
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __len__</ span > < span class ="hljs-params "> (self)</ span > :</ span >
1069
+ < span class ="hljs-keyword "> return</ span > len(self.a)
1070
+ < span class ="hljs-function "> < span class ="hljs-keyword "> def</ span > < span class ="hljs-title "> __getitem__</ span > < span class ="hljs-params "> (self, i)</ span > :</ span >
1071
+ < span class ="hljs-keyword "> return</ span > self.a[i]
1072
+ </ code > </ pre >
1073
+ < h4 id ="tableofprovidedmethods "> Table of provided methods:</ h4 >
1074
+ < pre > < code class ="text language-text "> +------------+----------+------------+----------+--------------+
1075
+ | | iterable | collection | sequence | abc.Sequence |
1076
+ +------------+----------+------------+----------+--------------+
1077
+ | iter() | yes | yes | yes | yes |
1078
+ | len() | | yes | yes | yes |
1079
+ | getitem() | | | yes | yes |
1080
+ | contains() | | yes | | yes |
1081
+ +------------+----------+------------+----------+--------------+
1042
1082
</ code > </ pre >
1043
1083
< h3 id ="iterator-1 "> Iterator</ h3 >
1044
1084
< pre > < code class ="python language-python hljs "> < span class ="hljs-class "> < span class ="hljs-keyword "> class</ span > < span class ="hljs-title "> Counter</ span > :</ span >
0 commit comments