• 기초, 자료형
    • >>> a = 4.24E10 >>> a = 4.24e-10
    • 4.24 x 10^10

 

  • x의 y제곱을 나타내는 ** 연산자 
    • >>> a = 3
    • >>> b = 4
    • >>> a ** b 81
  • 나눗셈 후 몫을 반환하는 // 연산자
    • >>> 7 / 4 = 1.75
    • >>> 7 // 4 = 1
  • 문자열 슬라이딩
    • >>> a = "Life is too short, You need Python" >>> a[0:4] 'Life'
    • a[시작번호:몇개]
    • a[ : 몇개] : 처음부터 몇개
    • a[시작번호 : ] : 시작번호부터 끝까지
>>> a = [1, 2, 3, 4, 5]
>>> b = a[:2]
>>> c = a[2:]
>>> b
[1, 2]
>>> c
[3, 4, 5]

//리스트 길이 구하기
a=[1,2,3]
len(a)
3

//리스트 수정
a=[1,2,3]
a[2]=4
a=[1,2,4]

//del 함수 리스트삭제
a=[1,2,3]
del a[1]
a=[1,3]

a=[1,2,3,4,5]
del[2:0] //2부터끝까지삭제한다.
a=[1,2]

//리스트 요소 추가
a=[1,2,3]
a.append(4)
a=[1,2,3,4]

a=[1,2,3]
a.append([5,6])
a=[1,2,3,[5,6]]

//리스트 정렬
a=[1,4,3,2]
a.sort()
a
a=[1,2,3,4]

a=[1,2,3]
a.reverse()
a=[3,2,1]

//리스트 find=index
a=[1,2,3]
a.index(3)
2

//리스트 요소삽입(insert)
a=[1,2,3]
a.insert(0,4)
a=a=[4,1,2,3]

a=[1,2,3]
a.insert(3,5) //배열a[3]=5이다.
a=[1,2,3,5]

//리스트 요소 삭제(remove)
a.remove(x) : 처음나오는 x를 삭제한다. 
a=[1,2,3,1,2,3]
a.remove()
a=[1,2,1,2,3]

//리스트 요소 끄집어내기(pop)
pop_back()
a=[1,2,3]
a.pop()
a=[1,2]

//리스트의 포함된 x의 개수 새기 count(x)
a=[1,2,3,1]
a.count(1)
2

//리스트 확장
//extend(x)에서 x는 리스트만 올 수 이쓰며 원래의 a리스트이 x리스트를 더하게 된다.
a=[1,2,3]
a.extend([4,5])
a
a=[1,2,3,4,5]

  • 문자열 포맷팅
    • 숫자 바로 대입
      • >>> "I eat %d apples." % 3
      • 'I eat 3 apples.'
      • number = 3
      • >>> "I eat %d apples." % number
      • 결과 : 'I eat 3 apples.'
  • 문자열 바로 대입
    • >>> "I eat %s apples." % "five" '
    • 결과 : I eat five apples.
    • >>> number = 10 >>> day = "three"
    • >>> "I ate %d apples. so I was sick for %s days." % (number, day)
    • 결과 : 'I ate 10 apples. so I was sick for three days.'
  • format 함수를 사용한 포매팅
    • >>> "I eat {0} apples".format(3)
    • 결과 : 'I eat 3 apples'
    • >>> number = 3
    • >>> "I eat {0} apples".format(number)
    • 결과 : 'I eat 3 apples'
    • >>> number = 10 >>> day = "three"
    • >>> "I ate {0} apples. so I was sick for {1} days.".format(number, day)
    • 결과 : 'I ate 10 apples. so I was sick for three days.'

=================================================================================================================리스트 ==================================

============================================================================

  • 리스트 자료형
    • 형식 -> odd = [1, 3, 5, 7, 9] 
      • 예제) 
      • >>> a = [1, 2, 3, ['a', 'b', 'c']]
      • >>> a[0] 1
      • >>> a[-1] ['a', 'b', 'c'] //뒤로 가기 가능 
      • >>> a[3] ['a', 'b', 'c']
  • 리스트에 요소 추가(append)
    • >>> a = [1, 2, 3]
    • >>> a.append(4)
    • 결과 : >>> a [1, 2, 3, 4]
  • 리스트 정렬(sort) 
    • >>> a = [1, 4, 3, 2]
    • >>> a.sort()
    • 결과 : >>> a [1, 2, 3, 4]
  • 위치 반환(index)
    • >>> a = [1,2,3]
    • >>> a.index(3) 2
    • 결과 : >>> a.index(1) 0
  • 리스트에 요소 삽입(insert)
    • >>> a = [1, 2, 3]
    • >>> a.insert(0, 4)
    • 결과 : >>> a [4, 1, 2, 3]
  • 리스트 요소 제거(remove)
    • >>> a = [1, 2, 3, 1, 2, 3]
    • >>> a.remove(3)
    • 결괴 : >>> a [1, 2, 1, 2, 3] //첫번째 3만 없어진 것을 알 수있다
  • 리스트 요소 끄집어내기(pop)
    • >>> a = [1,2,3]
    • >>> a.pop() //맨 뒤 3을 꺼낸다. ==pop_back() = vector랑 같은 후입선출...
    • >>> a [1, 2]

 

=================================================================================================================튜플 ===================================

============================================================================

  • 튜플(tuple)은 몇 가지 점을 제외하곤 리스트와 거의 비슷하며 리스트와 다른 점은 다음과 같다.
    • 리스트는 [ ]으로 둘러싸지만 튜플은 ( )으로 둘러싼다.
    • 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없다.
  • 형식
    • >>> t1 = ()
    • >>> t2 = (1,)
    • >>> t3 = (1, 2, 3)
    • >>> t4 = 1, 2, 3
    • >>> t5 = ('a', 'b', ('ab', 'cd'))

===============================================================================================================딕셔너리 ===================================

============================================================================

a={key1:value1,key2:velue2,...}
b={1:'a','b':[1,2,3]}


//딕셔너리 요소 삭제하기
del a[1]
del a[key] 처럼 입력하면 지정한 key에 해당하는 {key, value} 쌍이 삭제된다.

//key 리스트 만들기
a={'name':'pey','phone':'0123123'}
a.keys()
dict_keys(['name',phone'}
a.keys()는 딕셔너리 a의 key만 모아서 dict_keys객체를 돌려준다.

//value 리스트 만들기 (values)
a.values()
dict_values(['pey','0123123'}

//key,value 쌍 얻기(items
a.tiems()
dict_items(...)

//key:value 쌍으로 지우기
a.clear()
a
{}

//key로 value 얻기
a.get('name')
'pey'
a.get('phone')
'001010203'

//key가 딕셔너리안에 존재하는지 조사하기(in)
a={'name':'pey','phone':'0123123'}
'name' in a //a안에name이있나
True
'email' in a
False


  • 딕셔너리
    • key,value형식 이며 {}로 둘러싸여 있다. 
    • key값은 중복을 허용하지 않는다. =map
    • 형식
    • {Key1:Value1, Key2:Value2, Key3:Value3, ...}
    • >>> dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
  • 딕셔너리 쌍 추가하기
    • >>> a = {1: 'a'}
    • >>> a[2] = 'b'
    • 결과 : >>> a {1: 'a', 2: 'b'}
  • 딕셔너리 요소 삭제
    • >>> del a[1]
    • 결과 : >>> a {2: 'b', 'name': 'pey', 3: [1, 2, 3]}
    • del 함수를 사용해서 del a[key] 처럼 입력하면 지정한 Key에 해당하는 {key:value}쌍이 삭제된다.
  • key값이용하여 value값 얻기.
    • >>> grade = {'pey': 10, 'julliet': 99}
    • >>> grade['pey'] 결과 : 10
    • >>> grade['julliet'] 결과 : 99
    • (get)이용
    • >>> a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
    • >>> a.get('name') 결과 : 'pey'
    • >>> a.get('phone') 결과 : '0119993323'
  • key가 딕셔너리에 존재 하는지 조사 하기(in)
    • >>> a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
    • >>> 'name' in a True
    • >>> 'email' in a False

===============================================================================================================IF조건문===================================

============================================================================

money = True
if money :
	print("택시")
else:
	print("걸어가라")
    
    
pocket =['paper','cellphone','money']
if 'money' in pocket:
	print("택시")
else
	print("걸어가라")
    
>>> pocket = ['paper', 'cellphone']
>>> card = True
>>> if 'money' in pocket:
...      print("택시를 타고가라")
... elif card: 
...      print("택시를 타고가라")
... else:
...      print("걸어가라")
...

===================================================================================================================while==================================

============================================================================

treeHit=0
while treeHit<10:
	treeHit = treeHit +1
    print("나무를%d번 찍었습니다" %treeHit)
    iftreeHit==10:
    	print("나무넘어갑니다")
coffee = 10
while True:
    money = int(input("돈을 넣어 주세요: "))
    if money == 300:
        print("커피를 줍니다.")
        coffee = coffee -1
    elif money > 300:
        print("거스름돈 %d를 주고 커피를 줍니다." % (money -300))
        coffee = coffee -1
    else:
        print("돈을 다시 돌려주고 커피를 주지 않습니다.")
        print("남은 커피의 양은 %d개 입니다." % coffee)
    if coffee == 0:
        print("커피가 다 떨어졌습니다. 판매를 중지 합니다.")
        break

===================================================================================================================for문==================================

============================================================================

//기본구조
for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...

//1) 예제
test_list = ['one', 'two', 'three']
for i in test_list;
	print(i)
결과 : 
one 
two 
three

//2) 예제
>>> a = [(1,2), (3,4), (5,6)]
>>> for (first, last) in a:
...     print(first + last)
...
3
7
11

//3) 예제
marks = [90,25,67,45,80]
number=0
for mark in marks:
	number =number +1
    if mark >=60:
    	print("%d번 학생은 합격입니다" %number)
    else:
    	print("%d번 학생은 불합격입니다"%number)
        
        
//4) 예제 range 함수
a= range(10)
-->결과 : range(0,10) // 0부터 10미만의 숫자를 포함하는 range 객체를 만들어 줍니다.

add=0
for i in range(1,11)
	add = add+i
print(add)

//5) 예제 range함수 활요
marks =[90,24,23,1,32]
for number in range(len(marks)):
	if marks[number] < 60:
    	continue
        
     print("%d 학생 축하합니다. 합격입니다" %(number+1))
     
     
     
     
 >>> for i in range(2,10):        # ①번 for문
...     for j in range(1, 10):   # ②번 for문
...         print(i*j, end=" ") 
...     print('') 
... 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81

==================================================================================================================함수==================================

============================================================================

def 함수이름(매개변수):
    <수행할 문장>
    ...
    return 결과값
 
 def add(a, b): 
    result = a + b 
    return result
//일반적인 함수
def add(a,b)
result = a+b
return result;

//입력값이 없는 함수
def say()
	return 'HI' 
// 입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?

def add_many(*args)
	result = 0
    for i in args:
    	result = result + i
    return result

result = add_many(1,2,3)
print(result)
결과 : 6

result = add_many(1,2,3,4,5,6,7,8,9,10)
print(result)
결과 : 10

//다른 예시
>>> def add_mul(choice, *args): 
...     if choice == "add": 
...         result = 0 
...         for i in args: 
...             result = result + i 
...     elif choice == "mul": 
...         result = 1 
...         for i in args: 
...             result = result * i 
...     return result 
... 
>>>


>>> result = add_mul('add', 1,2,3,4,5)
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120

//함수의 결괏값은 언제나 하나이다

>>> def add_and_mul(a,b): 
...     return a+b, a*b

>>> result = add_and_mul(3,4)

결과 : result = (7, 12)
>>> result1, result2 = add_and_mul(3, 4)
결과 : result=7, result2=12

==================================================================================================================내장함수================================

===================================================

abs

abs(x)는 어떤 숫자를 입력받았을 때, 그 숫자의 절댓값을 돌려주는 함수이다.

>>> abs(3) 3 >>> abs(-3) 3 >>> abs(-1.2) 1.2=========================

chr

chr(i)는 아스키(ASCII) 코드 값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수이다.

※ 아스키 코드란 0에서 127 사이의 숫자를 각각 하나의 문자 또는 기호에 대응시켜 놓은 것이다.

>>> chr(97) 'a' >>> chr(48) '0'

divmod

divmod(a, b)는 2개의 숫자를 입력으로 받는다. 그리고 a를 b로 나눈 몫과 나머지를 튜플 형태로 돌려주는 함수이다.

>>> divmod(7, 3) (2, 1)

몫을 구하는 연산자 //와 나머지를 구하는 연산자 %를 각각 사용한 결과와 비교해 보자.

>>> 7 // 3 2 >>> 7 % 3 1

enumerate

enumerate는 "열거하다"라는 뜻이다. 이 함수는 순서가 있는 자료형(리스트, 튜플, 문자열)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 돌려준다.

※ 보통 enumerate 함수는 다음 예제처럼 for문과 함께 자주 사용한다.

잘 이해되지 않으면 다음 예를 보자.

>>> for i, name in enumerate(['body', 'foo', 'bar']): ... print(i, name) ... 0 body 1 foo 2 bar

순서 값과 함께 body, foo, bar가 순서대로 출력되었다. 즉 위 예제와 같이 enumerate를 for문과 함께 사용하면 자료형의 현재 순서(index)와 그 값을 쉽게 알 수 있다.

for문처럼 반복되는 구간에서 객체가 현재 어느 위치에 있는지 알려 주는 인덱스 값이 필요할때 enumerate 함수를 사용하면 매우 유용하다.

filter

filter란 무엇인가를 걸러낸다는 뜻으로 filter 함수도 동일한 의미를 가진다.

filter 함수는 첫 번째 인수로 함수 이름을, 두 번째 인수로 그 함수에 차례로 들어갈 반복 가능한 자료형을 받는다. 그리고 두 번째 인수인 반복 가능한 자료형 요소가 첫 번째 인수인 함수에 입력되었을 때 반환 값이 참인 것만 묶어서(걸러 내서) 돌려준다.

다음 예를 보자.

#positive.py def positive(l): result = [] for i in l: if i > 0: result.append(i) return result print(positive([1,-3,2,0,-5,6]))

결과값: [1, 2, 6]

즉 위에서 만든 positive 함수는 리스트를 입력값으로 받아 각각의 요소를 판별해서 양수 값만 돌려주는 함수이다.

filter 함수를 사용하면 위 내용을 다음과 같이 간단하게 작성할 수 있다.

#filter1.py def positive(x): return x > 0 print(list(filter(positive, [1, -3, 2, 0, -5, 6])))

결과값: [1, 2, 6]

여기에서는 두 번째 인수인 리스트의 요소들이 첫 번째 인수인 positive 함수에 입력되었을때 반환 값이 참인 것만 묶어서 돌려준다. 앞의 예에서는 1, 2, 6만 양수여서 x > 0 문장이 참이되므로 [1, 2, 6]이라는 결괏값을 돌려주게 된 것이다.

앞의 함수는 lambda를 사용하면 더욱 간편하게 코드를 작성할 수 있다.

>>> list(filter(lambda x: x > 0, [1, -3, 2, 0, -5, 6])) [1, 2, 6]

람다(lambda)

lambda 인자 : 표현식

다음은 두 수를 더하는 함수입니다.

>>> def hap(x, y): ... return x + y ... >>> hap(10, 20) 30

이것을 람다 형식으로는 어떻게 표현할까요?

>>> (lambda x,y: x + y)(10, 20)

30

너무나 간단하죠? 함수가 이름조차도 없습니다. '그냥 10 + 20이라고 하면 되지'라고 말씀하시면 미워잉~.

몇 가지 함수를 더 배워보면서 람다가 어떻게 이용되는지 알아보도록 하죠.

hex

hex(x)는 정수 값을 입력받아 16진수(hexadecimal)로 변환하여 돌려주는 함수이다.

>>> hex(234) '0xea' >>> hex(3) '0x3'

id

id(object)는 객체를 입력받아 객체의 고유 주소 값(레퍼런스)을 돌려주는 함수이다.

>>> a = 3 >>> id(3) 135072304 >>> id(a) 135072304 >>> b = a >>> id(b) 135072304

input

input([prompt])은 사용자 입력을 받는 함수이다. 매개변수로 문자열을 주면 다음 세 번째 예에서 볼 수 있듯이 그 문자열은 프롬프트가 된다.

※ [ ] 기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법임을 기억하자.

>>> a = input() hi >>> a

'hi'

>>> b = input("Enter: ")

Enter: hi

 

int

int(x)는 문자열 형태의 숫자나 소수점이 있는 숫자 등을 정수 형태로 돌려주는 함수로, 정수를 입력으로 받으면 그대로 돌려준다.

>>> int('3') 3

>>> int(3.4) 3

int(x, radix)는 radix 진수로 표현된 문자열 x를 10진수로 변환하여 돌려준다.

2진수로 표현된 11의 10진수 값은 다음과 같이 구한다.

>>> int('11', 2) 3

16진수로 표현된 1A의 10진수 값은 다음과 같이 구한다.

>>> int('1A', 16) 26

 

isinstance

isinstance(object, class )는 첫 번째 인수로 인스턴스, 두 번째 인수로 클래스 이름을 받는다. 입력으로 받은 인스턴스가 그 클래스의 인스턴스인지를 판단하여 참이면 True, 거짓이면 False를 돌려준다.

>>> class Person: pass ... >>> a = Person() >>> isinstance(a, Person) True

위 예는 a가 Person 클래스가 만든 인스턴스임을 확인시켜 준다.

>>> b = 3 >>> isinstance(b, Person) False

b는 Person 클래스가 만든 인스턴스가 아니므로 False를 돌려준다.

len

len(s)은 입력값 s의 길이(요소의 전체 개수)를 돌려주는 함수이다.

>>> len("python") 6 >>> len([1,2,3]) 3 >>> len((1, 'a')) 2

 

list

list(s)는 반복 가능한 자료형 s를 입력받아 리스트로 만들어 돌려주는 함수이다.

>>> list("python") ['p', 'y', 't', 'h', 'o', 'n']

>>> list((1,2,3)) [1, 2, 3]

list 함수에 리스트를 입력으로 주면 똑같은 리스트를 복사하여 돌려준다.

>>> a = [1, 2, 3]

>>> b = list(a)

>>> b [1, 2, 3]

 

map

map(f, iterable)은 함수(f)와 반복 가능한(iterable) 자료형을 입력으로 받는다. map은 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수이다.

다음 예를 보자.

# two_times.py

def two_times(numberList):

result = [ ]

for number in numberList:

result.append(number*2)

return result

result = two_times([1, 2, 3, 4])

print(result)

two_times 함수는 리스트 요소를 입력받아 각 요소에 2를 곱한 결괏값을 돌려준다. 실행 결과는 다음과 같다.

결과값: [2, 4, 6, 8]

위 예제는 map 함수를 사용하면 다음처럼 바꿀 수 있다.

>>> def two_times(x): ... return x*2 ...

>>> list(map(two_times, [1, 2, 3, 4]))

[2, 4, 6, 8]

이제 앞 예제를 해석해 보자. 먼저 리스트의 첫 번째 요소인 1이 two_times 함수의 입력값으로 들어가고 1 * 2의 과정을 거쳐서 2가 된다. 다음으로 리스트의 두 번째 요소인 2가 2 * 2 의 과정을 거쳐 4가 된다. 따라서 결괏값 리스트는 이제 [2, 4]가 된다. 총 4개의 요솟값이 모두 수행되면 마지막으로 [2, 4, 6, 8]을 돌려준다. 이것이 map 함수가 하는 일이다.

※ 위 예에서 map의 결과를 리스트로 보여 주기위해 list 함수를 사용하여 출력하였다.

앞의 예는 lambda를 사용하면 다음처럼 간략하게 만들 수 있다.

>>> list(map(lambda a: a*2, [1, 2, 3, 4]))

[2, 4, 6, 8]

 

max

max(iterable)는 인수로 반복 가능한 자료형을 입력받아 그 최댓값을 돌려주는 함수이다.

>>> max([1, 2, 3]) 3 >>> max("python") 'y'

min

min(iterable)은 max 함수와 반대로, 인수로 반복 가능한 자료형을 입력받아 그 최솟값을 돌려주는 함수이다.

>>> min([1, 2, 3]) 1 >>> min("python") 'h'

oct

oct(x)는 정수 형태의 숫자를 8진수 문자열로 바꾸어 돌려주는 함수이다.

>>> oct(34) '0o42' >>> oct(12345) '0o30071'

 

ord

ord(c)는 문자의 아스키 코드 값을 돌려주는 함수이다.

※ ord 함수는 chr 함수와 반대이다.

>>> ord('a') 97

>>> ord('0') 48

 

pow

pow(x, y)는 x의 y 제곱한 결괏값을 돌려주는 함수이다.

>>> pow(2, 4) 16

>>> pow(3, 3) 27

 

range

range([start,] stop [,step] )는 for문과 함께 자주 사용하는 함수이다. 이 함수는 입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어 돌려준다.

인수가 하나일 경우

시작 숫자를 지정해 주지 않으면 range 함수는 0부터 시작한다.

>>> list(range(5)) [0, 1, 2, 3, 4]

인수가 2개일 경우

입력으로 주어지는 2개의 인수는 시작 숫자와 끝 숫자를 나타낸다. 단 끝 숫자는 해당 범위에 포함되지 않는다는 것에 주의하자.

>>> list(range(5, 10)) [5, 6, 7, 8, 9]

 

인수가 3개일 경우

세 번째 인수는 숫자 사이의 거리를 말한다.

>>> list(range(1, 10, 2))  // 1~9까지 +2씩 for(int i = 0 ; i < 10 ; i=i+2)

[1, 3, 5, 7, 9]

>>> list(range(0, -10, -1))

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

 

round

round(number[, ndigits]) 함수는 숫자를 입력받아 반올림해 주는 함수이다.

※ [, ndigits]는 ndigits가 있을 수도 있고 없을 수도 있다는 의미이다.

>>> round(4.6) 5 >>> round(4.2) 4

다음과 같이 실수 5.678을 소수점 2자리까지만 반올림하여 표시할 수 있다.

>>> round(5.678, 2) 5.68

round 함수의 두 번째 매개변수는 반올림하여 표시하고 싶은 소수점의 자릿수

 

str

str(object)은 문자열 형태로 객체를 변환하여 돌려주는 함수이다.

>>> str(3) '3'

>>> str('hi') 'hi'

>>> str('hi'.upper()) 'HI'

 

sum

sum(iterable) 은 입력받은 리스트나 튜플의 모든 요소의 합을 돌려주는 함수이다.

>>> sum([1,2,3]) 6

>>> sum((4,5,6)) 15

 

type

type(object)은 입력값의 자료형이 무엇인지 알려 주는 함수이다.

>>> type("abc") <class 'str'>

>>> type([ ]) <class 'list'>

>>> type(open("test", 'w')) <class '_io.TextIOWrapper'>

 

zip

zip(*iterable)은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다.

※ 여기서 사용한 *iterable은 반복 가능(iterable)한 자료형 여러 개를 입력할 수 있다는 의미이다.

잘 이해되지 않는다면 다음 예제를 살펴보자.

>>> list(zip([1, 2, 3], [4, 5, 6]))

[(1, 4), (2, 5), (3, 6)]

>>> list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))

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

>>> list(zip("abc", "def"))

[('a', 'd'), ('b', 'e'), ('c', 'f')]

+ Recent posts