Added files for Ecoanova's Python 3 course.

This commit is contained in:
2019-12-07 20:09:13 -04:00
committed by GitHub
parent 3a24267742
commit 6bf8ac0e01
29 changed files with 604 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
"THE BEER-WARE LICENSE" (Revision 42):
<sonofgrendel@gmail.com> wrote this file. As long as you retain this
notice you can do whatever you want with this stuff. If we meet some
day, and you think this stuff is worth it, you can buy me a beer in
return.
Miguel Angel Astor.

View File

@@ -0,0 +1,7 @@
* RSP: Rock Scissors Paper
RSP is a Python 3 clone of the classic MacOS software toy from 1996
[[https://macintoshgarden.org/games/rock-scissors-paper][Rock Scissors Paper]] by shareware publisher Argus IG.
#+ATTR_HTML: :alt Playing rock paper scissors against a robot. :align center
[[file:rsp2.png]]

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,176 @@
#! /usr/bin/env python3
import random as r
import threading as th
import tkinter as tk
# Gampelay constants
ROCK = 0
SCISSORS = 1
PAPER = 2
# Score variables
PLAYER_SCORE = 0
EYEGUY_SCORE = 0
# Threading timer object
TIMER = None
def main():
""" Main method of the game. """
def reset():
""" Restarts the game. """
global PLAYER_SCORE, EYEGUY_SCORE
PLAYER_SCORE = 0
EYEGUY_SCORE = 0
player_label["text"] = "Humanoid> " + str(PLAYER_SCORE)
eyeguy_label["text"] = str(EYEGUY_SCORE) + " <EyeGuy"
alien_at_ease()
def alien_at_ease():
""" Resets the EyeGuy label to it's base resting state. """
global TIMER
eyeguy.config(image = alien_graphics["resting"])
print("Eyeguy is resting.")
TIMER = None
def quit_game():
""" Cancels any pending timer ad closes the window. """
if TIMER is not None:
TIMER.cancel()
window.quit()
def play(player_choice):
""" Evaluates a game turn. """
global PLAYER_SCORE, EYEGUY_SCORE, TIMER
def choice2str(choice):
""" Returns the name of a gameplay move as a string. """
return "ROCK" if choice == ROCK else \
("SCISSORS" if choice == SCISSORS else "PAPER")
# Get EyeGuy's move
alien_choice = r.randrange(3)
# Check the outcome of this turn
if (alien_choice == ROCK and player_choice == SCISSORS) or \
(alien_choice == SCISSORS and player_choice == PAPER) or \
(alien_choice == PAPER and player_choice == ROCK):
# Check if EyeGuy won
print("Eyeguy won! " + choice2str(alien_choice) + " beats " + choice2str(player_choice))
EYEGUY_SCORE += 1
# Update EyeGuy's sprite
if alien_choice == ROCK:
eyeguy.config(image = alien_graphics["rock_win"])
elif alien_choice == SCISSORS:
eyeguy.config(image = alien_graphics["scsr_win"])
else:
eyeguy.config(image = alien_graphics["papr_win"])
elif (alien_choice == ROCK and player_choice == PAPER) or \
(alien_choice == SCISSORS and player_choice == ROCK) or \
(alien_choice == PAPER and player_choice == SCISSORS):
# Check if EyeGuy lost
print("Player won! " + choice2str(player_choice) + " beats " + choice2str(alien_choice))
PLAYER_SCORE += 1
# Update EyeGuy's sprite
if alien_choice == ROCK:
eyeguy.config(image = alien_graphics["rock_dft"])
elif alien_choice == SCISSORS:
eyeguy.config(image = alien_graphics["scsr_dft"])
else:
eyeguy.config(image = alien_graphics["papr_dft"])
else:
# Else its a tie
print(choice2str(alien_choice) + " and " + choice2str(player_choice) + " is a tie!")
# Update EyeGuy's sprite
if alien_choice == ROCK:
eyeguy.config(image = alien_graphics["rock_tie"])
elif alien_choice == SCISSORS:
eyeguy.config(image = alien_graphics["scsr_tie"])
else:
eyeguy.config(image = alien_graphics["papr_tie"])
# Update the score labels
player_label["text"] = "Humanoid> " + str(PLAYER_SCORE)
eyeguy_label["text"] = str(EYEGUY_SCORE) + " <EyeGuy"
# Set a timer to reset EyeGuy's sprite after 3 seconds
if TIMER is not None:
print("Canceled!")
TIMER.cancel()
TIMER = th.Timer(3, alien_at_ease)
TIMER.start()
# Create the game window
window = tk.Tk()
window.wm_title("Rock and Scissors VS Paper")
window.wm_resizable(width = tk.FALSE, height = tk.FALSE)
# Create the main menu bar
menubar = tk.Menu(window)
# Create the "game" menu option
game_menu = tk.Menu(menubar, tearoff = 0)
game_menu.add_command(label = "New Game", command = reset)
game_menu.add_command(label = "Quit", command = quit_game)
# Add the menu options to the menu bar
menubar.add_cascade(label = "Game", menu = game_menu)
window.config(menu = menubar)
# Load EyeGuy's sprites
alien_graphics = {
"resting" : tk.PhotoImage(file = "assets/gfx/eyeguy.1.1.png"),
"rock_tie" : tk.PhotoImage(file = "assets/gfx/eyeguy.2.1.png"),
"rock_win" : tk.PhotoImage(file = "assets/gfx/eyeguy.2.2.png"),
"rock_dft" : tk.PhotoImage(file = "assets/gfx/eyeguy.2.3.png"),
"scsr_tie" : tk.PhotoImage(file = "assets/gfx/eyeguy.3.1.png"),
"scsr_win" : tk.PhotoImage(file = "assets/gfx/eyeguy.3.2.png"),
"scsr_dft" : tk.PhotoImage(file = "assets/gfx/eyeguy.3.3.png"),
"papr_tie" : tk.PhotoImage(file = "assets/gfx/eyeguy.4.1.png"),
"papr_win" : tk.PhotoImage(file = "assets/gfx/eyeguy.4.2.png"),
"papr_dft" : tk.PhotoImage(file = "assets/gfx/eyeguy.4.3.png")
}
# Create and set the score labels
player_label = tk.Label(window, text = "Humanoid> " + str(PLAYER_SCORE), fg = "red")
player_label.grid(row = 0, column = 0)
eyeguy_label = tk.Label(window, text = str(EYEGUY_SCORE) + " <EyeGuy", fg = "blue")
eyeguy_label.grid(row = 0, column = 2)
# Create and set EyeGuy's sprite label
eyeguy = tk.Label(window, image = alien_graphics["resting"])
eyeguy.grid(row = 1, column = 0, columnspan = 3)
# Load the icons for the buttons
btn_icons = [tk.PhotoImage(file = "assets/gfx/btn.1.png"),
tk.PhotoImage(file = "assets/gfx/btn.2.png"),
tk.PhotoImage(file = "assets/gfx/btn.3.png")]
# Create and set each button
rock_btn = tk.Button(window, image = btn_icons[0], relief = tk.FLAT, command = lambda: play(0))
rock_btn.grid(row = 2, column = 0)
scsr_btn = tk.Button(window, image = btn_icons[1], relief = tk.FLAT, command = lambda: play(1))
scsr_btn.grid(row = 2, column = 1)
papr_btn = tk.Button(window, image = btn_icons[2], relief = tk.FLAT, command = lambda: play(2))
papr_btn.grid(row = 2, column = 2)
# Create and set the author label
text = tk.Label(window, text = "http://github.com/miky-kr5/")
text.grid(row = 3, column = 0, columnspan = 3)
# Show the window
try:
window.mainloop()
except KeyboardInterrupt:
print("Interrupted...")
# Game entry point
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,132 @@
#####################
# Atomic data types #
#####################
a = 89 # Integer
b = 0.5 # Float
c = 9 + 0.4j # Complex
d = True # Boolean
e = None # Nonetype
########################
# Composite data types #
########################
f = [1, '2', 3] # List
g = (1, '2', 3) # Tuple
h = {1: 'one', # Dict
'two': 2,
3: 'Three'}
i = set([1, 2, 3]) # Set
j = frozenset(f) # Frozen set
######################
# Control structures #
######################
# If
if 1 < 2:
print("It's true!")
elif 2 < 1:
print("It's false!")
else:
print("It's neither!")
# For
for i in f:
print(i)
# While
while a > 80:
print(a)
a -= 1
########################
# Function definitions #
########################
# No arguments
def fun():
return 89
fun()
# Functions without a return statement return None
def non():
pass
print(non())
# Positional arguments
def sum(a, b):
return a + b
print(sum(1, 2))
# Keyword arguments
def divide(dividend = 1, divisor = 1):
return dividend / divisor # Unsafe!!
print(divide())
print(divide(divisor = 2))
print(divide(dividend = 4, divisor = 2))
print(divide(divisor = 4, dividend = 2))
# Both argument types
def xnp(x, n, p = 1):
# Keyword args MUST appear AFTER positional args!
return (x * n) + p
# Variable length arguments
def varargs(*args):
for a in args:
print("Argument " + str(args.index(a)) + " is " + str(a))
varargs(1)
varargs(2, 3)
varargs(4, 5, 6)
# Variable keyword arguments
def varkwargs(**kwargs):
for k in kwargs.keys():
print('Argument "' + str(k) + '" is "' + str(kwargs[k]))
varkwargs(a = 1, b = 2, c = 3)
# Everything!
def allargs(a, b, c = None, *args, **kwargs):
print("a is " + str(a))
print("b is " + str(b))
if c is None:
print("c is None")
else:
print("c is Some")
for a in args:
print("Argument " + str(args.index(a)) + " is " + str(a))
for k in kwargs.keys():
print('Argument "' + str(k) + '" is "' + str(kwargs[k]))
allargs('a', 1, None, 2, 3, 4, q = "Hail", w = "Caesar!")
allargs(1, 2, c = 89)
# Nested functions
def outer(x):
def inner(y):
return x + y
return inner(9)
print(outer(1))

View File

@@ -0,0 +1,33 @@
################
# Simple class #
################
class Class(object):
def __init__(self, a):
self.a = a
def method(self):
return self.a
o = Class(1)
print(o.method())
print(o.a) # !
####################
# With inheritance #
####################
class Subclass(Class):
def __init__(self, a, b):
super(Subclass, self).__init__(a)
self.b = b
def method(self):
return self.b
def sub_method(self):
return self.a
s = Subclass(1, 2)
print(s.method())
print(s.sub_method())

View File

@@ -0,0 +1,36 @@
import sqlite3
# "Connect" to a database
conn = sqlite3.connect('example.db')
# Get a cursor to operate on the database
c = conn.cursor()
# Create table
c.execute('''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)''')
# Insert a row of data
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
# Save (commit) the changes
conn.commit()
# Select
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print(c.fetchone())
# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
('2006-04-06', 'SELL', 'IBM', 500, 53.00),
]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
print(row)
# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()

View File

@@ -0,0 +1,28 @@
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
},
{
"type": "mobile",
"number": "123 456-7890"
}
],
"children": [],
"spouse": null
}

View File

@@ -0,0 +1,31 @@
################################
# Lambda (anonymous) functions #
################################
f = lambda x, y: x + y
print(f(1, 2))
print()
##########################
# Higher order functions #
##########################
# Map: Applies a function to many lists. Returns a generator.
for i in map(lambda x: x*x, [1, 2, 3, 4, 5, 6]):
print(i)
print()
for i in map(f, [1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7]):
print(i)
print()
# Custom higher order function
def hof(function = lambda x: x, *args):
for a in args:
print(function(a))
hof(lambda s: s.upper(), "a", "b", "c")
print()
hof(lambda x: x is None, 1, ["a", "b"], None, {})

View File

@@ -0,0 +1,46 @@
####################
# Generator object #
####################
def simple_generator():
i = 0
while(i < 10):
yield i
i += 1
raise StopIteration
g = simple_generator()
for i in g:
print(i)
try:
print(next(g))
except StopIteration:
print("Generator exhausted!")
else:
print("Generator success!")
finally:
print("At the end!")
####################
# Collection class #
####################
class Collection(object):
def __init__(self):
self.c = []
def add(self, x):
self.c.append(x)
def __iter__(self):
for i in self.c:
yield i
c = Collection()
c.add(1)
c.add(2)
c.add(3)
for i in c:
print(i)

View File

@@ -0,0 +1,7 @@
import urllib.request
# Create an HTTP request and get the response.
response = urllib.request.urlopen("http://www.concisa.net.ve/2016/evi-2016-tutoriales/")
# Get the response data.
document = response.read()
print(document)

View File

@@ -0,0 +1,8 @@
from http.server import HTTPServer, SimpleHTTPRequestHandler
def run(server_class = HTTPServer, handler_class = SimpleHTTPRequestHandler):
server_address = ('127.0.0.1', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
run()

View File

@@ -0,0 +1,16 @@
import json
data = {"Name": "Miguel",
"Age": 27,
"ID": 18810993,
"info" : {"Height": 1.72,
"Weight": 80
}
}
with open("data.json", "w") as f:
f.write(json.dumps(data))
with open("example.json") as f:
j = json.loads(f.read())
print(j["isAlive"])

View File

@@ -0,0 +1,60 @@
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
#################
# List indexing #
#################
# Classical position indexing
i = 0
while i < len(a):
print(a[i])
i += 1
# Negative indices
print(a[-1])
print(a[-2])
print(a[-3])
################
# List slicing #
################
# Elements between indices 3 and 7
print(a[3:7])
# Elements from index 5 onwards
print(a[5:])
# Elements from the start up to index 8
print(a[:8])
#######################
# List comprehensions #
#######################
# The first 10 square natural numbers
l = [x * x for x in range(1, 10)]
print(l)
# The first even square natural numbers
l = [x * x for x in range(1, 10) if (x * x) % 2 == 0]
print(l)
# Some numbers from the first list
l = [x for x in a if x > 2 and x < 7]
print(l)
#######
# zip #
#######
l = [x for x in zip([1, 2, 3, 4], ["a", "b", "c"], ["Hello", ",", "World", "!"])]
print(l)

View File

@@ -0,0 +1,16 @@
import random as r
def qsort(l):
if len(l) == 0:
return []
elif len(l) == 1:
return l
else:
less = qsort([x for x in l[1:] if x <= l[0]])
more = qsort([x for x in l[1:] if x > l[0]])
return less + [l[0]] + more
a = [r.randint(0, 100) for x in range(100)]
b = qsort(a)
print(a)
print(b)

Binary file not shown.