I'm sorry C++ …… I betrayed you.
- Abstract Base Class(ABC) as Interface Practice (2024.11.30)
pydantic
: Comparing with@dataclass
(2024.11.27)pydantic
: Comparing Example Code With and Withoutpydantic
(2024.11.26)asyncio
: Comparing Sync. Function Handling and Full Async. Requests (2024.09.06)- Extract 3-Bit Palette Indices (2024.08.04)
hello_world("print")
(2024.05.23)re.sub()
(2023.02.12)- Vertical Alignment 2 with f-string (2022.04.27)
- Arguements Parsing (2022.03.24)
- Vertical Alignment with Korean Letters (2021.12.21)
- Iterator (2021.06.17)
if
~while
~true
(2021.05.04)re.split()
(2021.04.29)__name__ == '__main__'
(2021.04.26)- Turtle (2021.03.24)
map()
(2021.02.16)- Words Mix (2021.01.13)
- Count Words (2020.11.10)
- Operator Precedence (2020.06.28)
print()
(2020.03.31)- Fibonacci Series (2019.12.18)
- Generate List (2019.12.07)
with
~open()
(2019.07.21)- Password (2019.05.24)
- Class (2018.02.07)
while
(2017.05.15)
-
Overview
- Python does not provide separate syntax for interfaces, but abstract classes can be used as a concept similar to interfaces in other languages.
- Abstract classes used as interfaces are more about enforcing specific method declarations rather than promoting code reusability.
-
Code and Results
Code : abc_as_interface.py
from abc import ABC, abstractmethod
class MischievousBoy(ABC): """Abstract base class defining the interface for mischievous boys.""" @abstractmethod def play_prank(self): """Play a prank on someone.""" # pass # not necessary @abstractmethod def get_in_trouble(self): """Get into trouble for doing something naughty.""" # pass # not necessary class Timmy(MischievousBoy): """Concrete class representing Timmy, a mischievous boy.""" def play_prank(self): """Timmy's specific implementation of playing a prank.""" print("Timmy puts a whoopee cushion on the teacher's chair!") def get_in_trouble(self): """Timmy's specific way of getting into trouble.""" print("Timmy gets detention for drawing on the walls.") class Johnny(MischievousBoy): """Concrete class representing Johnny, another mischievous boy.""" def play_prank(self): """Johnny's specific implementation of playing a prank.""" print("Johnny hides all the chalk in the classroom!") def get_in_trouble(self): """Johnny's specific way of getting into trouble.""" print("Johnny has to clean the blackboard for a week.")
# Create instances of the mischievous boys timmy = Timmy() johnny = Johnny() # Demonstrate Timmy and Johnny in action timmy.play_prank() timmy.get_in_trouble() johnny.play_prank() johnny.get_in_trouble()
Results
Timmy puts a whoopee cushion on the teacher's chair! Timmy gets detention for drawing on the walls. Johnny hides all the chalk in the classroom! Johnny has to clean the blackboard for a week.
-
Overview
- Original
@dataclass
is fast but lacks validation features. pydantic.BaseModel
provides validation functionality.pydantic.dataclasses
allows the use of validation with the same syntax as@dataclass
- Although it's presumed that the performance is not as good as the original
@dataclass
.
- Although it's presumed that the performance is not as good as the original
- Original
-
Case 1 :
@dataclass
withoutpydantic
Code : pydantic_dataclass_1.py
from dataclasses import dataclass from typing import List
@dataclass class Superhero: name: str superpowers: List[str] weakness: str age: int
# Create superheroes batman = Superhero("Batman", ["Rich", "Smart"], "No superpowers", 35) superman = Superhero("Superman", ["Flight", "Super strength"], "Kryptonite", 33) # Print superhero information print(f"{batman.name}'s superpowers: {', '.join(batman.superpowers)}") print(f"{superman.name}'s weakness: {superman.weakness}")
# This case doesn't raise an error but is logically incorrect weird_hero = Superhero("Weird Guy", ["Sleeping"], "Wife", -5) print(f"Weird hero's age: {weird_hero.age}") # Negative age is allowed
Results
Batman's superpowers: Rich, Smart Superman's weakness: Kryptonite Weird hero's age: -5
-
Case 2 :
pydantic.BaseModel
instead of@dataclass
Code : pydantic_dataclass_2.py
from typing import List from pydantic import BaseModel, Field
class Superhero(BaseModel): name: str superpowers: List[str] weakness: str age: int = Field(..., gt=0, lt=1000)
# Create superheroes batman = Superhero(name="Batman", superpowers=["Rich", "Smart"], weakness="No superpowers", age=35) superman = Superhero(name="Superman", superpowers=["Flight", "Super strength"], weakness="Kryptonite", age=33) # Print superhero information print(f"{batman.name}'s superpowers: {', '.join(batman.superpowers)}") print(f"{superman.name}'s weakness: {superman.weakness}")
# Error case try: weird_hero = Superhero(name="Weird Guy", superpowers=["Sleeping"], weakness="Wife", age=-5) print(f"Weird hero's age: {weird_hero.age}") except ValueError as e: print(f"Error occurred: {e}")
Results
Batman's superpowers: Rich, Smart Superman's weakness: Kryptonite Error occurred: 1 validation error for Superhero age Input should be greater than 0 [type=greater_than, input_value=-5, input_type=int] For further information visit https://errors.pydantic.dev/2.10/v/greater_than
-
Case 3 :
@dataclass
frompydantic.dataclasses
Code : pydantic_dataclass_3.py
from typing import List from pydantic.dataclasses import dataclass from pydantic import Field
@dataclass class Superhero: name: str superpowers: List[str] weakness: str age: int = Field(..., gt=0, lt=1000)
# Create superheroes batman = Superhero("Batman", ["Rich", "Smart"], "No superpowers", 35) superman = Superhero("Superman", ["Flight", "Super strength"], "Kryptonite", 33) # Print superhero information print(f"{batman.name}'s superpowers: {', '.join(batman.superpowers)}") print(f"{superman.name}'s weakness: {superman.weakness}")
# Error case try: weird_hero = Superhero("Weird Guy", ["Sleeping"], "Wife", -5) print(f"Weird hero's age: {weird_hero.age}") except ValueError as e: print(f"Error occurred: {e}")
Results
Batman's superpowers: Rich, Smart Superman's weakness: Kryptonite Error occurred: 1 validation error for Superhero 3 Input should be greater than 0 [type=greater_than, input_value=-5, input_type=int] For further information visit https://errors.pydantic.dev/2.10/v/greater_than
-
A comparison made between code using Pydantic and code without it
- Pydantic is an excellent library that contributes to improved code productivity
- It provides concise representation of data structures and reduces code needed for type conversion, data validation and error handling
- Therefore, we should use Pydantic. Let's start using it immediately
- Official Docs ☞ https://docs.pydantic.dev/
-
pydantic_with.py
Code
from pydantic import BaseModel
class User(BaseModel): """ Represents a user in the system. """ id: int name: str is_active: bool
# Sample user data with string values user_data = { 'id': '123', # Will be automatically converted to int 'name': 'Alice', 'is_active': 'true' # Will be automatically converted to bool } # Create a User instance from the dictionary # Pydantic will automatically validate and convert the data types user = User(**user_data) # Print the user object as a JSON string print(user.model_dump_json())
Results
{"id":123,"name":"Alice","is_active":true}
-
pydantic_without.py
Code
import json
class UserManual: """ Represents a user in the system, demonstrating manual implementation of type validation and JSON serialization. """ def __init__(self, user_id, name, is_active): """ Initialize a UserManual instance. Raises: ValueError: If any of the input types are incorrect. """ if not isinstance(user_id, int): raise ValueError("id must be an int") if not isinstance(name, str): raise ValueError("name must be a str") if not isinstance(is_active, bool): raise ValueError("is_active must be a bool") self.user_id = user_id self.name = name self.is_active = is_active def to_json(self): """ Convert the UserManual instance to a JSON string. """ return json.dumps({ 'id': self.user_id, 'name': self.name, 'is_active': self.is_active })
# Sample user data with string values user_data_manual = { 'id': '123', # Requires explicit conversion to int 'name': 'Alice', 'is_active': 'true' # Requires explicit conversion to bool } # Manually convert data types and create UserManual instance user_manual = UserManual( int(user_data_manual['id']), user_data_manual['name'], user_data_manual['is_active'].lower() == 'true' ) # Serialize to JSON and print print(user_manual.to_json())
Results
{"id": 123, "name": "Alice", "is_active": true}
- Review of how to reuse synchronous code within an asynchronous context
- Using
asyncio.loop.run_in_executor()
- Using
- Comparison between code using
aiohttp
for full asynchronous execution and the re-used synchronous code-
Results show no significant difference. In cases where a synchronous function is already written and internal computation is less significant compared to network latency, reusing the synchronous function as-is, rather than rewriting it asynchronously, seems to be a more reasonable choice.
-
asyncio_1_handling_sync_funtion.py
Import modules
import asyncio import time import requests
def fetch_sync()
def fetch_sync(url): """ Sends a synchronous HTTP GET request to the provided URL and measures the time taken for the request. Args: url (str): The URL to send the request to. Returns: float: The time taken for the HTTP request in seconds. """ start_time = time.time() # Record the start time _ = requests.get(url, timeout=100) # The results are not needed elapsed_time = time.time() - start_time # Calculate elapsed time return elapsed_time
async def fetch_async()
async def fetch_async(loop, url): """ Asynchronously executes a synchronous HTTP request function using `run_in_executor`. Args: loop (asyncio.AbstractEventLoop): The event loop to run the task in. url (str): The URL to send the request to. Returns: float: The time taken for the HTTP request in seconds. """ return await loop.run_in_executor(None, fetch_sync, url)
async def main
async def main(base_url, delay_time, n): """ The main asynchronous function that constructs the URLs and sends multiple requests concurrently, measuring and printing the time taken for each request and the total time for all requests. Args: base_url (str): The base URL for the HTTP requests. delay_time (int): The delay time to append to the base URL (used in URL path). n (int): The number of requests to send. Returns: None """ loop = asyncio.get_event_loop() url = f"{base_url}/{delay_time}" tasks = [fetch_async(loop, url) for _ in range(n)] start_time = time.time() results = await asyncio.gather(*tasks) print(f"Tasks completed in {time.time() - start_time:.2f} seconds") for i, elapsed_time in enumerate(results, 1): print(f"Response {i} took {elapsed_time:.2f} seconds")
Run
if __name__ == "__main__": BASE_URL = "https://httpbin.org/delay" DELAY_TIME = 3 N = 10 asyncio.run(main(BASE_URL, DELAY_TIME, N))
-
asyncio_2_entire_async.py
Import modules
import asyncio import time import aiohttp
async def fetch()
async def fetch(url): """ Asynchronously performs an HTTP GET request to the provided URL and measures the time taken for the request. Args: url (str): The URL to send the request to. Returns: float: The time taken for the HTTP request in seconds. """ start_time = time.time() # Record the start time async with aiohttp.ClientSession() as session: async with session.get(url) as response: await response.text() # Read the response to ensure completion elapsed_time = time.time() - start_time # Calculate elapsed time return elapsed_time
async def main()
async def main(base_url, delay_time, n): """ The main asynchronous function that constructs the URLs and sends multiple requests concurrently, measuring and printing the time taken for each request and the total time for all requests. Args: base_url (str): The base URL for the HTTP requests. delay_time (int): The delay time to append to the base URL (used in URL path). n (int): The number of requests to send. Returns: None """ url = f"{base_url}/{delay_time}" # Create `n` asynchronous tasks, each sending a request to the same URL. tasks = [fetch(url) for _ in range(n)] start_time = time.time() results = await asyncio.gather(*tasks) print(f"Tasks completed in {time.time() - start_time:.2f} seconds") for i, elapsed_time in enumerate(results, 1): print(f"Response {i} took {elapsed_time:.2f} seconds")
Run
if __name__ == "__main__": BASE_URL = "https://httpbin.org/delay" DELAY_TIME = 3 N = 10 asyncio.run(main(BASE_URL, DELAY_TIME, N))
-
Results
asyncio_1_handling_sync_funtion
Tasks completed in 5.70 seconds Response 1 took 3.62 seconds Response 2 took 5.70 seconds Response 3 took 4.57 seconds Response 4 took 4.02 seconds Response 5 took 3.82 seconds Response 6 took 4.11 seconds Response 7 took 4.83 seconds Response 8 took 3.84 seconds Response 9 took 3.98 seconds Response 10 took 5.30 seconds
asyncio_2_entire_async
Tasks completed in 5.65 seconds Response 1 took 5.50 seconds Response 2 took 3.39 seconds Response 3 took 3.73 seconds Response 4 took 3.31 seconds Response 5 took 3.64 seconds Response 6 took 5.16 seconds Response 7 took 5.64 seconds Response 8 took 4.11 seconds Response 9 took 3.72 seconds Response 10 took 3.44 seconds
-
-
A practice to extract 3-bit palette indices for Get Portraits from
KAODATA.DAT
(Trial 2) (2024.08.05) -
Code and Results
Code : Extract3BitPaletteIndices.py
IS_TEST = True
def extract_3_bit_palette_indices(data): """ Extracts 3-bit palette indices from the given byte data. Args: data (list of int): The byte data to extract 3-bit palette indices from. Returns: list of int: The extracted 3-bit palette indices. """ bit_list = [] for index, byte in enumerate(data): for bit_position in range(8): bit = (byte >> (7 - bit_position)) & 1 bit_list.append(bit) # Extract individual bits if IS_TEST: print(f"data[{index}] : {byte:3d} {bin(byte):10s} {bit_list[-8:]}") # Extract 3-bit palette indices palette_indices = [] for index in range(0, len(bit_list), 3): if index + 2 < len(bit_list): palette_index = (bit_list[index] << 2) | (bit_list[index + 1] << 1) | bit_list[index + 2] if IS_TEST: print(f"palette_index[{int(index/3)}] : {bit_list[index:index+3]} {bin(palette_index):5s} {palette_index}") palette_indices.append(palette_index) return palette_indices
if __name__ == "__main__": # Test data test_data = [224, 84, 64] # Extract 3-bit palette indices extracted_palette_indices = extract_3_bit_palette_indices(test_data) print("Extracted 3-bit palette indices:", extracted_palette_indices)
Results
data[0] : 224 0b11100000 [1, 1, 1, 0, 0, 0, 0, 0] data[1] : 84 0b1010100 [0, 1, 0, 1, 0, 1, 0, 0] data[2] : 64 0b1000000 [0, 1, 0, 0, 0, 0, 0, 0]
palette_index[0] : [1, 1, 1] 0b111 7 palette_index[1] : [0, 0, 0] 0b0 0 palette_index[2] : [0, 0, 0] 0b0 0 palette_index[3] : [1, 0, 1] 0b101 5 palette_index[4] : [0, 1, 0] 0b10 2 palette_index[5] : [0, 0, 1] 0b1 1 palette_index[6] : [0, 0, 0] 0b0 0 palette_index[7] : [0, 0, 0] 0b0 0
Extracted 3-bit palette indices: [7, 0, 0, 5, 2, 1, 0, 0]
-
Just for fun ☞ related meme
- Other language version ☞ Bash TypeScript
-
Code and Result
Code : HelloWorldPrint.py
import sys
def hello_world(func_name): """ Dynamically call the given function using its name. The name of the current executing function is passed as an argument. Caution: Using eval() can pose security risks! Args: func_name (str): Name of the function to be called Returns: None """ current_func_name = sys._getframe().f_code.co_name func = eval(func_name) func(current_func_name)
if __name__ == "__main__": hello_world("print")
Result
hello_world
-
Get domain from e-mail address by
re.sub()
-
A partial practice for Coursera > Using Databases with Python (University of Michigan) > Week 2 > Assignment 2
Codes : ReSub.py
import re email = "[email protected]" domain = re.sub(r"[\w\.-_*]+@", "", email) print(domain)
The regex
[\w\.-_*]+@
is not the only answer, anyway it seems to work well.not.found
-
I dreamed of making a new open source library to do it for a while, but f-string is too strong …… This devil has broken my dear dream!
-
Reference ☞ https://docs.python.org/3/reference/lexical_analysis.html#formatted-string-literals
sample = [ ['이렇게', '하면'], ['줄이', '잘 맞을까'], ['모르겠네', '어디'], ['한 번', '볼까'], ]
1. Normal Approach
# 1. Normal Approach print("# 1. Normal Approach") for el in sample : print(el[0], el[1])
# 1. Normal Approach 이렇게 하면 줄이 잘 맞을까 모르겠네 어디 한 번 볼까
2. Use f-string
# 2. Use f-string sample[3][0] = '두 번' print("\n# 2. Use f-string") for el in sample : print(f"{el[0]:<10}", f"{el[1]:<10}") # Korean letters drive it to insanity
# 2. Use f-string 이렇게 하면 줄이 잘 맞을까 모르겠네 어디 두 번 볼까
2.1 Use f-string : Handle Korean letters
# 2.1 Use f-string : Handle Korean letters sample[3][0] = '세 번' print("\n# 2.1 Use f-string 2 : Handle Korean letters") for r in sample : length = [10, 10] for c in range(2) : for char in r[c] : if char >= '가' : length[c] -= 1 # print(length[0], length[1]) # test : ok # print(f"{r[0]:<length[0]} {r[1]:<length[1]}") # ValueError: Invalid format specifier; length[] → {length[]} print(f"{r[0]:<{length[0]}} {r[1]:<{length[1]}}")
# 2.1 Use f-string 2 : Handle Korean letters 이렇게 하면 줄이 잘 맞을까 모르겠네 어디 세 번 볼까
2.2 Use f-string : Change alignment direction
sample[3][0] = '네 번' print("\n2.2 Use f-string : Change alignment direction") for r in sample : length = [10, 10] for c in range(2) : for char in r[c] : if char >= '가' : length[c] -= 1 print(f"{r[0]:>{length[0]}} {r[1]:>{length[1]}}")
2.2 Use f-string : Change alignment direction 이렇게 하면 줄이 잘 맞을까 모르겠네 어디 네 번 볼까
2.3 Use f-string : Code generalization & individual alignment control
sample[3][0] = '다섯 번' print("\n2.3 Use f-string : Code generalization & individual alignment control") for r in sample : length = [10] * len(r) for c in range(len(r)) : for char in r[c] : if char >= '가' : length[c] -= 1 if c == 1 : print(f"{r[c]:>{length[c]}}", end = '') else : print(f"{r[c]:<{length[c]}}", end = '') print()
2.3 Use f-string : Code generalization & individual alignment control 이렇게 하면 줄이 잘 맞을까 모르겠네 어디 다섯 번 볼까
-
A practice to parse arguments from command line to
.py
script file -
Reference ☞ https://en.wikipedia.org/wiki/Command-line_argument_parsing
Codes : ArguementParsing.py
import sys
def ArguementParsing() : if len(sys.argv) > 1 : # not > 0; sys.argv[0] is the script file name for arg in sys.argv : print(arg) else : print("No arguments has been received.")
# test def test() : for arg in list(sys.argv) : print(arg)
if __name__ == "__main__" : ArguementParsing() # test() # 0(path) 1 2 3
Codes : ArguementParsing.bat
python ArguementParsing.py python ArguementParsing.py a b c
Output
> python ArguementParsing.py No arguments has been received. > python ArguementParsing.py a b c ArguementParsing.py a b c
-
A solution for the problem to align text vertically with both of English and Korean letters
Codes : VerticalAlignment.py
# Korean letter's length is also measured as 1 abcd = "abcd" ssjj = "삼성전자" print(len(abcd)) print(len(ssjj))
4 4
# How to count Korean letter's length as 2 length = 0 for char in ssjj : if char >= '가' : length += 2 print(length)
8
# Vertical alignment list = ["abcd", "삼성전자"] # trial 1 for i in list : print(i, '\t', 100)
abcd 100 삼성전자 100
# trial 2 for i in list : length = 10 for char in i : if char >= '가' : length -= 2 else : length -= 1 i += length * ' ' print(i, 100, sep = '')
abcd 100 삼성전자 100
Thses are arranged vertically well in the console output. Please believe me ……
-
Originally started from a stupid question : Can a
method
call other method in the same class? -
I've just realized it was really obvious (Why does
the constructor
exist?) -
This code is a strange station, that two methods call each other with
iterator
Codes : Iterator.py
turn = 0 class Bros : def __init__(self) : global turn turn += 1 print("<Conversation " + str(turn) + ">") self.conversation = iter(["Hey bro", "Wassup"]) self.n = 0 def bros1(self) : print(self.bros1.__name__ + " : " + next(self.conversation)) if (self.n < 1) : self.n += 1 self.bros2() else : print() def bros2(self) : print(self.bros2.__name__ + " : " + next(self.conversation)) if (self.n < 1) : self.n += 1 self.bros1() else : print()
if __name__ == "__main__" : Bros1 = Bros() Bros1.bros1() Bros2 = Bros() Bros2.bros2()
Output
<Conversation 1>
bros1 : Hey bro
bros2 : Wassup<Conversation 2>
bros2 : Hey bro
bros1 : Wassup
-
A practice of using
if
andwhile
-
All the strings and numbers except
0
andFalse
are regarded asTrue
Codes : IfWhileTrue.py
if True : print(True) if False : print(False) if 'abc' : print('abc') a = 1 if a : print(a) b = 0 if b : print(b) c = -1 if c : print(c)
True
abc
1
-1while True : print(True) break while False : print(False) break while '123' : print('123') break
True
123
-
Seperating a
string
by plural delimiters -
Using regular expression (
re
)txt = 'one two/three.four' # 1. string.split() print(txt.split()) # default : ' ' print(txt.split('/')) # print(txt.split(' ').split('/')) # Error # 2. Regular Expression import re print(re.split("[ /.]", txt)) # Enter delimiters directly print(re.split("\W", txt)) # \W = a-zA-Z0-9
['one', 'two/three.four']
['one two', 'three.four']
['one', 'two', 'three', 'four']
['one', 'two', 'three', 'four']
-
A practice of importing and running
module
in Python -
Using
__name__
and__main__
if __name__ == '__main__' : print("Don't call me yet.") def call() : print("Call me now.")
Don't call me yet.
import ModuleSample ModuleSample.call()
Call me now.
-
A practice of python module
turtle
-
Very easy!
Codes : Turtle.py
import turtle import time turtle.setup(width = 300, height = 300) turtle.title("My turtle practice") turtle.hideturtle() # hide turtle : make the moving speed faster turtle.home() # set the position (0, 0) turtle.position() turtle.penup() # penup() = pu() = up() : move without drawing turtle.setpos(0, 125) turtle.pendown() # pendown() = pd() = down() : move with drawing turtle.right(180) turtle.circle(125) # 1st circle turtle.penup() turtle.setpos(0, 100) turtle.pendown() time.sleep(0.3) turtle.circle(100) # 2nd circle turtle.delay(20) time.sleep(0.5) turtle.circle(100, steps=3) # 1st triangle turtle.penup() turtle.setpos(0, -100) turtle.right(180) turtle.pendown() turtle.circle(100, steps=3) # 2nd triangle turtle.penup() turtle.setpos(0, 100) turtle.right(180) turtle.delay(30) turtle.pendown() turtle.circle(100, steps=6) # hexagon turtle.mainloop() # avoid the screen closing
-
To find how
map()
runs- I guessed the result of running
map()
would be something to contain hidden elements. - But actually it is a
generator type object
, so has not futural list data before I request bylist()
.
- I guessed the result of running
-
References
- StackOverflow ☞ https://stackoverflow.com/questions/66225592/
- https://realpython.com/python-map-function/#getting-started-with-pythons-map
Codes : Map.py
def details(txt) : print("elements :", txt) print("type :", type(txt)) try : print("elements' type :", type(txt[0]), "\n") except : print("elements' type : an error occurs.\n") txt = "1 2 3 4 5" details(txt) txtsplit = txt.split() details(txtsplit) txtmap = map(int, txt.split()) details(txtmap) # an error occurs txtlist = list(txtmap) details(txtlist)
Results
elements : 1 2 3 4 5 type : <class 'str'> elements' type : <class 'str'> elements : ['1', '2', '3', '4', '5'] type : <class 'list'> elements' type : <class 'str'> elements : <map object at 0x7fefcdfe8dc0> type : <class 'map'> elements' type : an error occurs. elements : [1, 2, 3, 4, 5] type : <class 'list'> elements' type : <class 'int'>
-
Read a csv file into a dictionary
-
Import
csv
-
Seems that dictionary type is not so suitable to generate random paragraphs
0. Check If Words.csv Exists
import os
path = "C:\\Users\\……\\Python\\Words.csv" # \\ : escape character of \ os.path.isfile(path)
True
1. Read Words.csv simply
import csv
with open(path,'r', encoding='utf-8') as f: reader = csv.DictReader(f) for c in reader: for k, v in c.items(): print(v, end= ' ') print("\n")
멍청하게 떡볶이 먹고 배탈 나는 똥개
어리석게 꼭지에서 주식 사는 너구리
정신 못 차리고 반바지에 긴 양말 신은 코흘리개
한심하게 노래방 가서 고해 부르는 개미햝기
아무 생각없이 담뱃불 붙이다 앞머리 불 붙은 이등병1-1. Read Words.csv as dictionary type
with open(path,'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: print(row)
{'\ufeff수식어1': '멍청하게', '수식어2': '떡볶이 먹고 배탈 나는', '명사': '똥개'}
{'\ufeff수식어1': '어리석게', '수식어2': '꼭지에서 주식 사는', '명사': '너구리'}
{'\ufeff수식어1': '정신 못 차리고', '수식어2': '반바지에 긴 양말 신은', '명사': '코흘리개'}
{'\ufeff수식어1': '한심하게', '수식어2': '노래방 가서 고해 부르는', '명사': '개미햝기'}
{'\ufeff수식어1': '아무 생각없이', '수식어2': '담뱃불 붙이다 앞머리 불 붙은', '명사': '이등병'}1-2. Get rid of '\ufeff' from the head of data
with open(path,'r', encoding='utf-8-sig') as f: reader = csv.DictReader(f) for row in reader: print(row)
{'수식어1': '멍청하게', '수식어2': '떡볶이 먹고 배탈 나는', '명사': '똥개'}
{'수식어1': '어리석게', '수식어2': '꼭지에서 주식 사는', '명사': '너구리'}
{'수식어1': '정신 못 차리고', '수식어2': '반바지에 긴 양말 신은', '명사': '코흘리개'}
{'수식어1': '한심하게', '수식어2': '노래방 가서 고해 부르는', '명사': '개미햝기'}
{'수식어1': '아무 생각없이', '수식어2': '담뱃불 붙이다 앞머리 불 붙은', '명사': '이등병'}
-
Count words without duplication from .txt file
-
import
re
for usingregular expression
Codes : CountWords.py
import os import re
# Check if the target file exists path = "C:\\...\\Python\\subtitle - 1.1.txt" os.path.isfile(path)
True
# Call words' list with duplication document_raw = open(path, 'r') document_lower = document_raw.read().lower() words_duplication = re.findall(r'\b[a-z]{3,15}\b', document_lower) # Regular expression to avoid meaningless or wrong words
# Remove duplication from the list words = set(words_duplication) print(len(words))
455
-
Answer for my friend YW Jang's question
-
Reference ☞ https://www.programiz.com/python-programming/precedence-associativity
Codes : OperatorPrecedence.py
print("F" == "M")
False
print(bool("m"))
True
==
runs prior toor
in Pythonprint("F" == "M" or "m") print(("F" == "M") or "m") # the same with the above line
True
-
Simple practice with
print()
Codes : Print.py
#1. Print normally print("위") print("아래")
위
아래#2. Write on the same line print("왼쪽", end='') print("에 붙여서 계속")
왼쪽에 붙여서 계속
#3. Change lines within one function print("줄을\n막\n바꿔")
줄을
막
바꿔
-
Simply Generating
Fibonacci Series
by Pythona = [1, 1] n = 2 while n<10 : # length = 10 a.append(a[n-2] + a[n-1]) n += 1 print(a)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
-
Generate lists by various ways
list1 = [[0,0], [0,0], [0,0], [0,0]] list2 = [[0,0]] * 4 list3 = [0,0] * 4 print(list1, "\n", list2, "\n", list3) list1 == list2
[[0, 0], [0, 0], [0, 0], [0, 0]]
[[0, 0], [0, 0], [0, 0], [0, 0]]
[0, 0, 0, 0, 0, 0, 0, 0]
True
-
Read binary file
-
Convert decimal number ↔ hexadecimal number
Codes : WithOpen.py
# get current working directory import os os.getcwd() print(os.getcwd()) # check if the file exists os.path.isfile("path")
True
import binascii # with statement with open('path','rb') as f: # rb : read & binary string = f.read() print(string[0:10]) print(binascii.b2a_hex(string[0:10]))
b'1990.02.19'
b'313939302e30322e3139'# with statement X f = open('path','rb') data = f.read() print(data[0:10]) print(binascii.b2a_hex(data[0:10])) f.close()
b'1990.02.19'
b'313939302e30322e3139'# decimal → hexadecimal hex(30000) hex(3000000) hex(100)
'0x7530'
'0x2dc6c0'
'0x64'# hexadecimal → decimal int('7530', 16) int('2dc6c0', 16) int('64', 16)
30000
3000000
100
-
Input the correct passworld within 5 trials or die
-
Practice
if
~else
,break
/continue
,time.sleep()
and so onCodes : Password.py
import time # for using time.sleep() chance = 0 pw_original = "mymy" # password. a word that calls a pass. you nahm sayin? while chance < 5 : pw_input = input("Input your password : ") # right if pw_original == pw_input : print("You entered the correct password") break # wrong else: chance += 1 print("You entered the wrong passwords", chance, "times.") if chance == 5 : print("You bad guys will be delayed as a penalty.") time.sleep(3) else : continue # Of course, saving the original password in this file is somewhat stupid. # But, yes I am.
-
Simple Python
class
practiceclass MyFirstClass : def Family(self, name, role): print(name, "is a(an)", role, "in my family") Do = MyFirstClass() Do.Family("Kim", "Husband") Do.Family("Shin", "Wife") Do.Family("Kim", "Future Baby")
I found that a simple
class
in Python doesn't need stuffs like__main__
,__init__
and so on.
What the__hell__
?
-
Simple Python practice
death_entropy = 100 my_entropy = 1 while(my_entropy < death_entropy) : print(my_entropy) my_entropy += 1 print('Nirvana')
1 2 3 …… 100 Nirvana