1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-01-17 21:49:22 +01:00
This commit is contained in:
root 2018-08-25 02:38:11 +00:00
commit afd18bd4ed
34 changed files with 1870 additions and 484 deletions

View File

@ -155,7 +155,7 @@ Small-o, commonly written as **o**, is an Asymptotic Notation to denote the
upper bound (that is not asymptotically tight) on the growth rate of runtime
of an algorithm.
`f(n)` is o(g(n)), if for some real constants c (c > 0) and n<sub>0</sub> (n<sub>0</sub> > 0), `f(n)` is < `c g(n)`
`f(n)` is o(g(n)), if for all real constants c (c > 0) and n<sub>0</sub> (n<sub>0</sub> > 0), `f(n)` is < `c g(n)`
for every input size n (n > n<sub>0</sub>).
The definitions of O-notation and o-notation are similar. The main difference
@ -168,7 +168,7 @@ Small-omega, commonly written as **ω**, is an Asymptotic Notation to denote
the lower bound (that is not asymptotically tight) on the growth rate of
runtime of an algorithm.
`f(n)` is ω(g(n)), if for some real constants c (c > 0) and n<sub>0</sub> (n<sub>0</sub> > 0), `f(n)` is > `c g(n)`
`f(n)` is ω(g(n)), if for all real constants c (c > 0) and n<sub>0</sub> (n<sub>0</sub> > 0), `f(n)` is > `c g(n)`
for every input size n (n > n<sub>0</sub>).
The definitions of Ω-notation and ω-notation are similar. The main difference

View File

@ -25,7 +25,7 @@ Nearly all examples below can be a part of a shell script or executed directly i
[Read more here.](http://www.gnu.org/software/bash/manual/bashref.html)
```bash
#!/bin/bash
#!/usr/bin/env bash
# First line of the script is shebang which tells the system how to execute
# the script: http://en.wikipedia.org/wiki/Shebang_(Unix)
# As you already figured, comments start with #. Shebang is also a comment.

212
citron.html.markdown Normal file
View File

@ -0,0 +1,212 @@
---
language: citron
filename: learncitron.ctr
contributors:
- ["AnotherTest", ""]
lang: en-us
---
```ruby
# Comments start with a '#'
# All comments encompass a single line
###########################################
## 1. Primitive Data types and Operators
###########################################
# You have numbers
3. # 3
# Numbers are all doubles in interpreted mode
# Mathematical operator precedence is not respected.
# binary 'operators' are evaluated in ltr order
1 + 1. # 2
8 - 4. # 4
10 + 2 * 3. # 36
# Division is always floating division
35 / 2 # 17.5.
# Integer division is non-trivial, you may use floor
(35 / 2) floor # 17.
# Booleans are primitives
True.
False.
# Boolean messages
True not. # False
False not. # True
1 = 1. # True
1 !=: 1. # False
1 < 10. # True
# Here, `not` is a unary message to the object `Boolean`
# Messages are comparable to instance method calls
# And they have three different forms:
# 1. Unary messages: Length > 1, and they take no arguments:
False not.
# 2. Binary Messages: Length = 1, and they take a single argument:
False & True.
# 3. Keyword messages: must have at least one ':', they take as many arguments
# as they have `:` s
False either: 1 or: 2. # 2
# Strings
'This is a string'.
'There are no character types exposed to the user'.
# "You cannot use double quotes for strings" <- Error
# Strins can be summed
'Hello, ' + 'World!'. # 'Hello, World!'
# Strings allow access to their characters
'This is a beautiful string' at: 0. # 'T'
###########################################
## intermission: Basic Assignment
###########################################
# You may assign values to the current scope:
var name is value. # assignes `value` into `name`
# You may also assign values into the current object's namespace
my name is value. # assigns `value` into the current object's `name` property
# Please note that these names are checked at compile (read parse if in interpreted mode) time
# but you may treat them as dynamic assignments anyway
###########################################
## 2. Lists(Arrays?) and Tuples
###########################################
# Arrays are allowed to have multiple types
Array new < 1 ; 2 ; 'string' ; Nil. # Array new < 1 ; 2 ; 'string' ; Nil
# Tuples act like arrays, but are immutable.
# Any shenanigans degrade them to arrays, however
[1, 2, 'string']. # [1, 2, 'string']
# They can interoperate with arrays
[1, 'string'] + (Array new < 'wat'). # Array new < 1 ; 'string' ; 'wat'
# Indexing into them
[1, 2, 3] at: 1. # 2
# Some array operations
var arr is Array new < 1 ; 2 ; 3.
arr head. # 1
arr tail. # Array new < 2 ; 3.
arr init. # Array new < 1 ; 2.
arr last. # 3
arr push: 4. # Array new < 1 ; 2 ; 3 ; 4.
arr pop. # 4
arr pop: 1. # 2, `arr` is rebound to Array new < 1 ; 3.
# List comprehensions
[x * 2 + y,, arr, arr + [4, 5],, x > 1]. # Array ← 7 ; 9 ; 10 ; 11
# fresh variable names are bound as they are encountered,
# so `x` is bound to the values in `arr`
# and `y` is bound to the values in `arr + [4, 5]`
#
# The general format is: [expr,, bindings*,, predicates*]
####################################
## 3. Functions
####################################
# A simple function that takes two variables
var add is {:a:b ^a + b.}.
# this function will resolve all its names except the formal arguments
# in the context it is called in.
# Using the function
add applyTo: 3 and: 5. # 8
add applyAll: [3, 5]. # 8
# Also a (customizable -- more on this later) pseudo-operator allows for a shorthand
# of function calls
# By default it is REF[args]
add[3, 5]. # 8
# To customize this behaviour, you may simply use a compiler pragma:
#:callShorthand ()
# And then you may use the specified operator.
# Note that the allowed 'operator' can only be made of any of these: []{}()
# And you may mix-and-match (why would anyone do that?)
add(3, 5). # 8
# You may also use functions as operators in the following way:
3 `add` 5. # 8
# This call binds as such: add[(3), 5]
# because the default fixity is left, and the default precedance is 1
# You may change the precedence/fixity of this operator with a pragma
#:declare infixr 1 add
3 `add` 5. # 8
# now this binds as such: add[3, (5)].
# There is another form of functions too
# So far, the functions were resolved in a dynamic fashion
# But a lexically scoped block is also possible
var sillyAdd is {\:x:y add[x,y].}.
# In these blocks, you are not allowed to declare new variables
# Except with the use of Object::'letEqual:in:`
# And the last expression is implicitly returned.
# You may also use a shorthand for lambda expressions
var mul is \:x:y x * y.
# These capture the named bindings that are not present in their
# formal parameters, and retain them. (by ref)
###########################################
## 5. Control Flow
###########################################
# inline conditional-expressions
var citron is 1 = 1 either: 'awesome' or: 'awful'. # citron is 'awesome'
# multiple lines is fine too
var citron is 1 = 1
either: 'awesome'
or: 'awful'.
# looping
10 times: {:x
Pen writeln: x.
}. # 10. -- side effect: 10 lines in stdout, with numbers 0 through 9 in them
# Citron properly supports tail-call recursion in lexically scoped blocks
# So use those to your heart's desire
# mapping most data structures is as simple as `fmap:`
[1, 2, 3, 4] fmap: \:x x + 1. # [2, 3, 4, 5]
# You can use `foldl:accumulator:` to fold a list/tuple
[1, 2, 3, 4] foldl: (\:acc:x acc * 2 + x) accumulator: 4. # 90
# That expression is the same as
(2 * (2 * (2 * (2 * 4 + 1) + 2) + 3) + 4)
###################################
## 6. IO
###################################
# IO is quite simple
# With `Pen` being used for console output
# and Program::'input' and Program::'waitForInput' being used for console input
Pen writeln: 'Hello, ocean!' # prints 'Hello, ocean!\n' to the terminal
Pen writeln: Program waitForInput. # reads a line and prints it back
```

View File

@ -16,7 +16,7 @@ popular and recent book is [Land of Lisp](http://landoflisp.com/). A new book ab
```common-lisp
```lisp
;;;-----------------------------------------------------------------------------
;;; 0. Syntax

View File

@ -13,7 +13,7 @@ Markdown byl vytvořen Johnem Gruberem v roce 2004. Je zamýšlen jako lehce či
a psatelná syntaxe, která je jednoduše převeditelná do HTML (a dnes i do mnoha
dalších formátů)
```markdown
```md
<!-- Markdown je nadstavba nad HTML, takže jakýkoliv kód HTML je validní
Markdown, to znamená, že můžeme používat HTML elementy, třeba jako komentář, a
nebudou ovlivněny parserem Markdownu. Avšak, pokud vytvoříte HTML element v

View File

@ -16,19 +16,19 @@ Nodes
**Represents a record in a graph.**
```()```
`()`
It's an empty *node*, to indicate that there is a *node*, but it's not relevant for the query.
```(n)```
`(n)`
It's a *node* referred by the variable **n**, reusable in the query. It begins with lowercase and uses camelCase.
```(p:Person)```
`(p:Person)`
You can add a *label* to your node, here **Person**. It's like a type / a class / a category. It begins with uppercase and uses camelCase.
```(p:Person:Manager)```
`(p:Person:Manager)`
A node can have many *labels*.
```(p:Person {name : 'Théo Gauchoux', age : 22})```
`(p:Person {name : 'Théo Gauchoux', age : 22})`
A node can have some *properties*, here **name** and **age**. It begins with lowercase and uses camelCase.
The types allowed in properties :
@ -40,7 +40,7 @@ The types allowed in properties :
*Warning : there isn't datetime property in Cypher ! You can use String with a specific pattern or a Numeric from a specific date.*
```p.name```
`p.name`
You can access to a property with the dot style.
@ -49,16 +49,16 @@ Relationships (or Edges)
**Connects two nodes**
```[:KNOWS]```
`[:KNOWS]`
It's a *relationship* with the *label* **KNOWS**. It's a *label* as the node's label. It begins with uppercase and use UPPER_SNAKE_CASE.
```[k:KNOWS]```
`[k:KNOWS]`
The same *relationship*, referred by the variable **k**, reusable in the query, but it's not necessary.
```[k:KNOWS {since:2017}]```
`[k:KNOWS {since:2017}]`
The same *relationship*, with *properties* (like *node*), here **since**.
```[k:KNOWS*..4]```
`[k:KNOWS*..4]`
It's a structural information to use in a *path* (seen later). Here, **\*..4** says "Match the pattern, with the relationship **k** which be repeated between 1 and 4 times.
@ -67,16 +67,16 @@ Paths
**The way to mix nodes and relationships.**
```(a:Person)-[:KNOWS]-(b:Person)```
`(a:Person)-[:KNOWS]-(b:Person)`
A path describing that **a** and **b** know each other.
```(a:Person)-[:MANAGES]->(b:Person)```
`(a:Person)-[:MANAGES]->(b:Person)`
A path can be directed. This path describes that **a** is the manager of **b**.
```(a:Person)-[:KNOWS]-(b:Person)-[:KNOWS]-(c:Person)```
`(a:Person)-[:KNOWS]-(b:Person)-[:KNOWS]-(c:Person)`
You can chain multiple relationships. This path describes the friend of a friend.
```(a:Person)-[:MANAGES]->(b:Person)-[:MANAGES]->(c:Person)```
`(a:Person)-[:MANAGES]->(b:Person)-[:MANAGES]->(c:Person)`
A chain can also be directed. This path describes that **a** is the boss of **b** and the big boss of **c**.
Patterns often used (from Neo4j doc) :
@ -230,13 +230,13 @@ DELETE n, r
Other useful clauses
---
```PROFILE```
`PROFILE`
Before a query, show the execution plan of it.
```COUNT(e)```
`COUNT(e)`
Count entities (nodes or relationships) matching **e**.
```LIMIT x```
`LIMIT x`
Limit the result to the x first results.

View File

@ -14,7 +14,7 @@ fácilmente a HTML (y, actualmente, otros formatos también).
¡Denme toda la retroalimentación que quieran! / ¡Sientanse en la libertad de hacer forks o pull requests!
```markdown
```md
<!-- Markdown está basado en HTML, así que cualquier archivo HTML es Markdown
válido, eso significa que podemos usar elementos HTML en Markdown como, por
ejemplo, el comentario y no serán afectados por un parseador Markdown. Aún

View File

@ -13,7 +13,7 @@ Objective C es el lenguaje de programación principal utilizado por Apple para l
Es un lenguaje de programación para propósito general que le agrega al lenguaje de programación C una mensajería estilo "Smalltalk".
```objective_c
```objectivec
// Los comentarios de una sola línea inician con //
/*

View File

@ -10,7 +10,7 @@ filename: learnvisualbasic-es.vb
lang: es-es
---
```vb
```
Module Module1
Sub Main()

View File

@ -10,7 +10,7 @@ lang: fi-fi
John Gruber loi Markdownin vuona 2004. Sen tarkoitus on olla helposti luettava ja kirjoitettava syntaksi joka muuntuu helposti HTML:ksi (ja nyt myös moneksi muuksi formaatiksi).
```markdown
```md
<!-- Jokainen HTML-tiedosto on pätevää Markdownia. Tämä tarkoittaa että voimme
käyttää HTML-elementtejä Markdownissa, kuten kommentteja, ilman että markdown
-jäsennin vaikuttaa niihin. Tästä johtuen et voi kuitenkaan käyttää markdownia

View File

@ -138,5 +138,5 @@ $('p').each(function() {
});
``
```

View File

@ -15,15 +15,15 @@ contributors:
---
Go was created out of the need to get work done. It's not the latest trend
in computer science, but it is the newest fastest way to solve real-world
in programming language theory, but it is a way to solve real-world
problems.
It has familiar concepts of imperative languages with static typing.
It draws concepts from imperative languages with static typing.
It's fast to compile and fast to execute, it adds easy-to-understand
concurrency to leverage today's multi-core CPUs, and has features to
help with large-scale programming.
concurrency because multi-core CPUs are now common, and it's used successfully
in large codebases (~100 million loc at Google, Inc.).
Go comes with a great standard library and an enthusiastic community.
Go comes with a good standard library and a sizeable community.
```go
// Single line comment
@ -48,7 +48,7 @@ import (
// executable program. Love it or hate it, Go uses brace brackets.
func main() {
// Println outputs a line to stdout.
// Qualify it with the package name, fmt.
// It comes from the package fmt.
fmt.Println("Hello world!")
// Call another function within this package.

View File

@ -13,7 +13,7 @@ Markdown dibuat oleh John Gruber pada tahun 2004. Tujuannya untuk menjadi syntax
Beri masukan sebanyak-banyaknya! / Jangan sungkan untuk melakukan fork dan pull request!
```markdown
```md
<!-- Markdown adalah superset dari HTML, jadi setiap berkas HTML adalah markdown yang
valid, ini berarti kita dapat menggunakan elemen HTML dalam markdown, seperti elemen
komentar, dan ia tidak akan terpengaruh parser markdown. Namun, jika Anda membuat

View File

@ -28,7 +28,7 @@ Markdown varia nelle sue implementazioni da un parser all'altro. Questa guida ce
## Elementi HTML
Markdown è un superset di HTML, quindi ogni file HTML è a sua volta un file Markdown valido.
```markdown
```md
<!-- Questo significa che possiamo usare elementi di HTML in Markdown, come per esempio i commenti,
e questi non saranno modificati dal parser di Markdown. State attenti però,
se inserite un elemento HTML nel vostro file Markdown, non potrete usare la sua sintassi

View File

@ -400,8 +400,8 @@ else: # Anche else è opzionale
print("some_var è 10.")
"""
I cicli for iterano sulle liste, cioé ripetono un codice per ogni elemento
# di una lista.
I cicli for iterano sulle liste, cioè ripetono un codice per ogni elemento
di una lista.
Il seguente codice scriverà:
cane è un mammifero
gatto è un mammifero
@ -409,7 +409,7 @@ Il seguente codice scriverà:
"""
for animale in ["cane", "gatto", "topo"]:
# Puoi usare format() per interpolare le stringhe formattate.
print("{} is a mammal".format(animal))
print("{} è un mammifero".format(animale))
"""
"range(numero)" restituisce una lista di numeri da zero al numero dato

View File

@ -600,10 +600,6 @@ of the language.
[Eloquent Javascript][8] by Marijn Haverbeke is an excellent JS book/ebook with
attached terminal
[Eloquent Javascript - The Annotated Version][9] by Gordon Zhu is also a great
derivative of Eloquent Javascript with extra explanations and clarifications for
some of the more complicated examples.
[Javascript: The Right Way][10] is a guide intended to introduce new developers
to JavaScript and help experienced developers learn more about its best practices.
@ -624,6 +620,5 @@ Mozilla Developer Network.
[6]: http://www.amazon.com/gp/product/0596805527/
[7]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript
[8]: http://eloquentjavascript.net/
[9]: http://watchandcode.com/courses/eloquent-javascript-the-annotated-version
[10]: http://jstherightway.org/
[11]: https://javascript.info/

View File

@ -2,17 +2,17 @@
language: Julia
contributors:
- ["Leah Hanson", "http://leahhanson.us"]
- ["Pranit Bauva", "http://github.com/pranitbauva1997"]
- ["Daniel YC Lin", "http://github.com/dlintw"]
- ["Pranit Bauva", "https://github.com/pranitbauva1997"]
- ["Daniel YC Lin", "https://github.com/dlintw"]
filename: learnjulia.jl
---
Julia is a new homoiconic functional language focused on technical computing.
While having the full power of homoiconic macros, first-class functions, and low-level control, Julia is as easy to learn and use as Python.
This is based on Julia 0.6.4
This is based on Julia 1.0.0
```ruby
```julia
# Single line comments start with a hash (pound) symbol.
#= Multiline comments can be written
@ -37,7 +37,7 @@ This is based on Julia 0.6.4
8 - 1 # => 7
10 * 2 # => 20
35 / 5 # => 7.0
5 / 2 # => 2.5 # dividing an Int by an Int always results in a Float
5 / 2 # => 2.5 # dividing integers always results in a Float64
div(5, 2) # => 2 # for a truncated result, use div
5 \ 35 # => 7.0
2^2 # => 4 # power, not bitwise xor
@ -55,10 +55,10 @@ xor(2, 4) # => 6 # bitwise xor
2 >> 1 # => 1 # arithmetic shift right
2 << 1 # => 4 # logical/arithmetic shift left
# You can use the bits function to see the binary representation of a number.
bits(12345)
# Use the bitstring function to see the binary representation of a number.
bitstring(12345)
# => "0000000000000000000000000000000000000000000000000011000000111001"
bits(12345.0)
bitstring(12345.0)
# => "0100000011001000000111001000000000000000000000000000000000000000"
# Boolean values are primitives
@ -81,33 +81,23 @@ false
2 < 3 < 2 # => false
# Strings are created with "
try
"This is a string."
catch ; end
# Julia has several types of strings, including ASCIIString and UTF8String.
# More on this in the Types section.
# Character literals are written with '
try
'a'
catch ; end
# Some strings can be indexed like an array of characters
try
"This is a string"[1] # => 'T' # Julia indexes from 1
catch ; end
# However, this is will not work well for UTF8 strings,
# so iterating over strings is recommended (map, for loops, etc).
# Strings are UTF8 encoded. Only if they contain only ASCII characters can
# they be safely indexed.
ascii("This is a string")[1] # => 'T' # Julia indexes from 1
# Otherwise, iterating over strings is recommended (map, for loops, etc).
# $ can be used for string interpolation:
try
"2 + 2 = $(2 + 2)" # => "2 + 2 = 4"
catch ; end
# You can put any Julia expression inside the parentheses.
# Another way to format strings is the printf macro.
@printf "%d is less than %f" 4.5 5.3 # 4 is less than 5.300000
# Another way to format strings is the printf macro from the stdlib Printf.
using Printf
@printf "%d is less than %f\n" 4.5 5.3 # => 5 is less than 5.300000
# Printing is easy
println("I'm Julia. Nice to meet you!")
@ -127,7 +117,7 @@ some_var # => 5
# Accessing a previously unassigned variable is an error
try
some_other_var # => ERROR: some_other_var not defined
some_other_var # => ERROR: UndefVarError: some_other_var not defined
catch e
println(e)
end
@ -167,7 +157,7 @@ b[end] # => 6
# 2-dimensional arrays use space-separated values and semicolon-separated rows.
matrix = [1 2; 3 4] # => 2x2 Int64 Array: [1 2; 3 4]
# Arrays of a particular Type
# Arrays of a particular type
b = Int8[4, 5, 6] # => 3-element Int8 Array: [4, 5, 6]
# Add stuff to the end of a list with push! and append!
@ -189,9 +179,9 @@ a[1] # => 1 # remember that Julia indexes from 1, not 0!
# indexing expression
a[end] # => 6
# we also have shift and unshift
shift!(a) # => 1 and a is now [2,4,3,4,5,6]
unshift!(a,7) # => [7,2,4,3,4,5,6]
# we also have popfirst! and pushfirst!
popfirst!(a) # => 1 and a is now [2,4,3,4,5,6]
pushfirst!(a, 7) # => [7,2,4,3,4,5,6]
# Function names that end in exclamations points indicate that they modify
# their argument.
@ -201,15 +191,17 @@ sort!(arr) # => [4,5,6]; arr is now [4,5,6]
# Looking out of bounds is a BoundsError
try
a[0] # => ERROR: BoundsError() in getindex at array.jl:270
a[end+1] # => ERROR: BoundsError() in getindex at array.jl:270
a[0]
# => BoundsError: attempt to access 7-element Array{Int64,1} at index [0]
a[end + 1]
# => BoundsError: attempt to access 7-element Array{Int64,1} at index [8]
catch e
println(e)
end
# Errors list the line and file they came from, even if it's in the standard
# library. If you built Julia from source, you can look in the folder base
# inside the julia folder to find these files.
# library. You can look in the folder share/julia inside the julia folder to
# find these files.
# You can initialize arrays from ranges
a = [1:5;] # => 5-element Int64 Array: [1,2,3,4,5]
@ -235,13 +227,13 @@ length(a) # => 8
# Tuples are immutable.
tup = (1, 2, 3) # => (1,2,3) # an (Int64,Int64,Int64) tuple.
tup[1] # => 1
try:
try
tup[1] = 3 # => ERROR: no method setindex!((Int64,Int64,Int64),Int64,Int64)
catch e
println(e)
end
# Many list functions also work on tuples
# Many array functions also work on tuples
length(tup) # => 3
tup[1:2] # => (1,2)
in(2, tup) # => true
@ -265,19 +257,20 @@ empty_dict = Dict() # => Dict{Any,Any}()
# You can create a dictionary using a literal
filled_dict = Dict("one" => 1, "two" => 2, "three" => 3)
# => Dict{ASCIIString,Int64}
# => Dict{String,Int64}
# Look up values with []
filled_dict["one"] # => 1
# Get all keys
keys(filled_dict)
# => KeyIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2])
# => Base.KeySet for a Dict{String,Int64} with 3 entries. Keys:
# "two", "one", "three"
# Note - dictionary keys are not sorted or in the order you inserted them.
# Get all values
values(filled_dict)
# => ValueIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2])
# => Base.ValueIterator{Dict{String,Int64}} with 3 entries. Values: 2, 1, 3
# Note - Same as above regarding key ordering.
# Check for existence of keys in a dictionary with in, haskey
@ -288,7 +281,7 @@ haskey(filled_dict, 1) # => false
# Trying to look up a non-existent key will raise an error
try
filled_dict["four"] # => ERROR: key not found: four in getindex at dict.jl:489
filled_dict["four"] # => KeyError: key "four" not found
catch e
println(e)
end
@ -301,20 +294,20 @@ get(filled_dict,"four",4) # => 4
# Use Sets to represent collections of unordered, unique values
empty_set = Set() # => Set{Any}()
# Initialize a set with values
filled_set = Set([1,2,2,3,4]) # => Set{Int64}(1,2,3,4)
filled_set = Set([1, 2, 2, 3, 4]) # => Set([4, 2, 3, 1])
# Add more values to a set
push!(filled_set,5) # => Set{Int64}(5,4,2,3,1)
push!(filled_set, 5) # => Set([4, 2, 3, 5, 1])
# Check if the values are in the set
in(2, filled_set) # => true
in(10, filled_set) # => false
# There are functions for set intersection, union, and difference.
other_set = Set([3, 4, 5, 6]) # => Set{Int64}(6,4,5,3)
intersect(filled_set, other_set) # => Set{Int64}(3,4,5)
union(filled_set, other_set) # => Set{Int64}(1,2,3,4,5,6)
setdiff(Set([1,2,3,4]),Set([2,3,5])) # => Set{Int64}(1,4)
other_set = Set([3, 4, 5, 6]) # => Set([4, 3, 5, 6])
intersect(filled_set, other_set) # => Set([4, 3, 5])
union(filled_set, other_set) # => Set([4, 2, 3, 5, 6, 1])
setdiff(Set([1,2,3,4]), Set([2,3,5])) # => Set([4, 1])
####################################################
@ -355,8 +348,9 @@ end
# cat is a mammal
# mouse is a mammal
for a in Dict("dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal")
println("$(a[1]) is a $(a[2])")
for pair in Dict("dog" => "mammal", "cat" => "mammal", "mouse" => "mammal")
from, to = pair
println("$from is a $to")
end
# prints:
# dog is a mammal
@ -372,11 +366,12 @@ end
# mouse is a mammal
# While loops loop while a condition is true
x = 0
let x = 0
while x < 4
println(x)
x += 1 # Shorthand for x = x + 1
end
end
# prints:
# 0
# 1
@ -506,9 +501,10 @@ add_10(3) # => 13
map(add_10, [1,2,3]) # => [11, 12, 13]
filter(x -> x > 5, [3, 4, 5, 6, 7]) # => [6, 7]
# We can use list comprehensions for nicer maps
# We can use list comprehensions
[add_10(i) for i = [1, 2, 3]] # => [11, 12, 13]
[add_10(i) for i in [1, 2, 3]] # => [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7]
####################################################
## 5. Types
@ -529,13 +525,13 @@ typeof(DataType) # => DataType
# Users can define types
# They are like records or structs in other languages.
# New types are defined using the `type` keyword.
# New types are defined using the `struct` keyword.
# type Name
# struct Name
# field::OptionalType
# ...
# end
type Tiger
struct Tiger
taillength::Float64
coatcolor # not including a type annotation is the same as `::Any`
end
@ -555,6 +551,7 @@ sherekhan = typeof(tigger)(5.6,"fire") # => Tiger(5.6,"fire")
abstract type Cat end # just a name and point in the type hierarchy
# Abstract types cannot be instantiated, but can have subtypes.
using InteractiveUtils # defines the subtype and supertype function
# For example, Number is an abstract type
subtypes(Number) # => 2-element Array{Any,1}:
# Complex{T<:Real}
@ -562,13 +559,11 @@ subtypes(Number) # => 2-element Array{Any,1}:
subtypes(Cat) # => 0-element Array{Any,1}
# AbstractString, as the name implies, is also an abstract type
subtypes(AbstractString) # 6-element Array{Union{DataType, UnionAll},1}:
# Base.SubstitutionString
# Base.Test.GenericString
# DirectIndexString
# RevString
subtypes(AbstractString) # 4-element Array{Any,1}:
# String
# SubString
# SubstitutionString
# Test.GenericString
# Every type has a super type; use the `supertype` function to get it.
typeof(5) # => Int64
@ -583,10 +578,10 @@ supertype(Any) # => Any
typeof("fire") # => String
supertype(String) # => AbstractString
# Likewise here with String
supertype(DirectIndexString) # => AbstractString
supertype(SubString) # => AbstractString
# <: is the subtyping operator
type Lion <: Cat # Lion is a subtype of Cat
struct Lion <: Cat # Lion is a subtype of Cat
mane_color
roar::AbstractString
end
@ -597,7 +592,7 @@ end
Lion(roar::AbstractString) = Lion("green", roar)
# This is an outer constructor because it's outside the type definition
type Panther <: Cat # Panther is also a subtype of Cat
struct Panther <: Cat # Panther is also a subtype of Cat
eye_color
Panther() = new("green")
# Panthers will only have this constructor, and no default constructor.
@ -635,9 +630,9 @@ meow(Lion("brown","ROAAR")) # => "ROAAR"
meow(Panther()) # => "grrr"
# Review the local type hierarchy
issubtype(Tiger,Cat) # => false
issubtype(Lion,Cat) # => true
issubtype(Panther,Cat) # => true
Tiger <: Cat # => false
Lion <: Cat # => true
Panther <: Cat # => true
# Defining a function that takes Cats
function pet_cat(cat::Cat)
@ -680,7 +675,8 @@ try
fight(Panther(), Lion("RAWR"))
catch e
println(e)
# => MethodError(fight, (Panther("green"), Lion("green", "RAWR")), 0x000000000000557b)
# => MethodError(fight, (Panther("green"), Lion("green", "RAWR")),
# 0x000000000000557b)
end
# Also let the cat go first
@ -688,10 +684,12 @@ fight(c::Cat,l::Lion) = println("The cat beats the Lion")
# This warning is because it's unclear which fight will be called in:
try
fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The victorious cat says rarrr
fight(Lion("RAR"), Lion("brown", "rarrr"))
# => prints The victorious cat says rarrr
catch e
println(e)
# => MethodError(fight, (Lion("green", "RAR"), Lion("brown", "rarrr")), 0x000000000000557c)
# => MethodError(fight, (Lion("green", "RAR"), Lion("brown", "rarrr")),
# 0x000000000000557c)
end
# The result may be different in other versions of Julia
@ -704,7 +702,7 @@ fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The lions come to a tie
square_area(l) = l * l # square_area (generic function with 1 method)
square_area(5) #25
square_area(5) # => 25
# What happens when we feed square_area an integer?
code_native(square_area, (Int32,))
@ -779,6 +777,6 @@ code_native(circle_area, (Float64,))
## Further Reading
You can get a lot more detail from [The Julia Manual](http://docs.julialang.org/en/latest/#Manual-1)
You can get a lot more detail from the [Julia Documentation](https://docs.julialang.org/)
The best place to get help with Julia is the (very friendly) [Discourse forum](https://discourse.julialang.org/).

View File

@ -689,14 +689,14 @@ first each (1 2 3;4 5 6;7 8 9)
/ each-left (\:) and each-right (/:) modify a two-argument function
/ to treat one of the arguments and individual variables instead of a list
1 2 3 +\: 1 2 3
/ => 2 3 4
/ => 3 4 5
/ => 4 5 6
1 2 3 +/: 1 2 3
/ => 2 3 4
/ => 3 4 5
/ => 4 5 6
1 2 3 +\: 11 22 33
/ => 12 23 34
/ => 13 24 35
/ => 14 25 36
1 2 3 +/: 11 22 33
/ => 12 13 14
/ => 23 24 25
/ => 34 35 36
/ The true alternatives to loops in q are the adverbs scan (\) and over (/)
/ their behaviour differs based on the number of arguments the function they

View File

@ -25,7 +25,7 @@ lang: ko-kr
## HTML 요소
HTML은 마크다운의 수퍼셋입니다. 모든 HTML 파일은 유효한 마크다운이라는 것입니다.
```markdown
```md
<!--따라서 주석과 같은 HTML 요소들을 마크다운에 사용할 수 있으며, 마크다운 파서에 영향을
받지 않을 것입니다. 하지만 마크다운 파일에서 HTML 요소를 만든다면 그 요소의 안에서는
마크다운 문법을 사용할 수 없습니다.-->

View File

@ -197,7 +197,7 @@ inside your code
end
```
Inline code can be created using the backtick character `
Inline code can be created using the backtick character `` ` ``
```md
John didn't even know what the `go_to()` function did!

366
mips.html.markdown Normal file
View File

@ -0,0 +1,366 @@
---
language: "MIPS Assembly"
filename: MIPS.asm
contributors:
- ["Stanley Lim", "https://github.com/Spiderpig86"]
---
The MIPS (Microprocessor without Interlocked Pipeline Stages) Assembly language
is designed to work with the MIPS microprocessor paradigm designed by J. L.
Hennessy in 1981. These RISC processors are used in embedded systems such as
gateways and routers.
[Read More](https://en.wikipedia.org/wiki/MIPS_architecture)
```assembly
# Comments are denoted with a '#'
# Everything that occurs after a '#' will be ignored by the assembler's lexer.
# Programs typically contain a .data and .text sections
.data # Section where data is stored in memory (allocated in RAM), similar to
# variables in higher level languages
# Declarations follow a ( label: .type value(s) ) form of declaration
hello_world: .asciiz "Hello World\n" # Declare a null terminated string
num1: .word 42 # Integers are referred to as words
# (32 bit value)
arr1: .word 1, 2, 3, 4, 5 # Array of words
arr2: .byte 'a', 'b' # Array of chars (1 byte each)
buffer: .space 60 # Allocates space in the RAM
# (not cleared to 0)
# Datatype sizes
_byte: .byte 'a' # 1 byte
_halfword: .half 53 # 2 bytes
_word: .word 3 # 4 bytes
_float: .float 3.14 # 4 bytes
_double: .double 7.0 # 8 bytes
.align 2 # Memory alignment of data, where
# number indicates byte alignment in
# powers of 2. (.align 2 represents
# word alignment since 2^2 = 4 bytes)
.text # Section that contains instructions
# and program logic
.globl _main # Declares an instruction label as
# global, making it accessible to
# other files
_main: # MIPS programs execute instructions
# sequentially, where the code under
# this label will be executed firsts
# Let's print "hello world"
la $a0, hello_world # Load address of string stored in
# memory
li $v0, 4 # Load the syscall value (indicating
# type of functionality)
syscall # Perform the specified syscall with
# the given argument ($a0)
# Registers (used to hold data during program execution)
# $t0 - $t9 # Temporary registers used for
# intermediate calculations inside
# subroutines (not saved across
# function calls)
# $s0 - $s7 # Saved registers where values are
# saved across subroutine calls.
# Typically saved in stack
# $a0 - $a3 # Argument registers for passing in
# arguments for subroutines
# $v0 - $v1 # Return registers for returning
# values to caller function
# Types of load/store instructions
la $t0, label # Copy the address of a value in
# memory specified by the label into
# register $t0
lw $t0, label # Copy a word value from memory
lw $t1, 4($s0) # Copy a word value from an address
# stored in a register with an offset
# of 4 bytes (addr + 4)
lb $t2, label # Copy a byte value to the lower order
# portion of the register $t2
lb $t2, 0($s0) # Copy a byte value from the source
# address in $s0 with offset 0
# Same idea with 'lh' for halfwords
sw $t0, label # Store word value into memory address
# mapped by label
sw $t0, 8($s0) # Store word value into address
# specified in $s0 and offset of 8 bytes
# Same idea using 'sb' and 'sh' for bytes and halfwords. 'sa' does not exist
### Math ###
_math:
# Remember to load your values into a register
lw $t0, num # From the data section
li $t0, 5 # Or from an immediate (constant)
li $t1, 6
add $t2, $t0, $t1 # $t2 = $t0 + $t1
sub $t2, $t0, $t1 # $t2 = $t0 - $t1
mul $t2, $t0, $t1 # $t2 = $t0 * $t1
div $t2, $t0, $t1 # $t2 = $t0 / $t1 (Might not be
# supported in some versons of MARS)
div $t0, $t1 # Performs $t0 / $t1. Get the quotient
# using 'mflo' and remainder using 'mfhi'
# Bitwise Shifting
sll $t0, $t0, 2 # Bitwise shift to the left with
# immediate (constant value) of 2
sllv $t0, $t1, $t2 # Shift left by a variable amount in
# register
srl $t0, $t0, 5 # Bitwise shift to the right (does
# not sign preserve, sign-extends with 0)
srlv $t0, $t1, $t2 # Shift right by a variable amount in
# a register
sra $t0, $t0, 7 # Bitwise arithmetic shift to the right
# (preserves sign)
srav $t0, $t1, $t2 # Shift right by a variable amount
# in a register
# Bitwise operators
and $t0, $t1, $t2 # Bitwise AND
andi $t0, $t1, 0xFFF # Bitwise AND with immediate
or $t0, $t1, $t2 # Bitwise OR
ori $t0, $t1, 0xFFF # Bitwise OR with immediate
xor $t0, $t1, $t2 # Bitwise XOR
xori $t0, $t1, 0xFFF # Bitwise XOR with immediate
nor $t0, $t1, $t2 # Bitwise NOR
## BRANCHING ##
_branching:
# The basic format of these branching instructions typically follow <instr>
# <reg1> <reg2> <label> where label is the label we want to jump to if the
# given conditional evaluates to true
# Sometimes it is easier to write the conditional logic backwards, as seen
# in the simple if statement example below
beq $t0, $t1, reg_eq # Will branch to reg_eq if
# $t0 == $t1, otherwise
# execute the next line
bne $t0, $t1, reg_neq # Branches when $t0 != $t1
b branch_target # Unconditional branch, will always execute
beqz $t0, req_eq_zero # Branches when $t0 == 0
bnez $t0, req_neq_zero # Branches when $t0 != 0
bgt $t0, $t1, t0_gt_t1 # Branches when $t0 > $t1
bge $t0, $t1, t0_gte_t1 # Branches when $t0 >= $t1
bgtz $t0, t0_gt0 # Branches when $t0 > 0
blt $t0, $t1, t0_gt_t1 # Branches when $t0 < $t1
ble $t0, $t1, t0_gte_t1 # Branches when $t0 <= $t1
bltz $t0, t0_lt0 # Branches when $t0 < 0
slt $s0, $t0, $t1 # Instruction that sends a signal when
# $t0 < $t1 with reuslt in $s0 (1 for true)
# Simple if statement
# if (i == j)
# f = g + h;
# f = f - i;
# Let $s0 = f, $s1 = g, $s2 = h, $s3 = i, $s4 = j
bne $s3, $s4, L1 # if (i !=j)
add $s0, $s1, $s2 # f = g + h
L1:
sub $s0, $s0, $s3 # f = f - i
# Below is an example of finding the max of 3 numbers
# A direct translation in Java from MIPS logic:
# if (a > b)
# if (a > c)
# max = a;
# else
# max = c;
# else
# max = b;
# else
# max = c;
# Let $s0 = a, $s1 = b, $s2 = c, $v0 = return register
ble $s0, $s1, a_LTE_b # if (a <= b) branch(a_LTE_b)
ble $s0, $s2, max_C # if (a > b && a <=c) branch(max_C)
move $v0, $s1 # else [a > b && a > c] max = a
j done # Jump to the end of the program
a_LTE_b: # Label for when a <= b
ble $s1, $s2, max_C # if (a <= b && b <= c) branch(max_C)
move $v0, $s1 # if (a <= b && b > c) max = b
j done # Jump to done
max_C:
move $v0, $s2 # max = c
done: # End of program
## LOOPS ##
_loops:
# The basic structure of loops is having an exit condition and a jump
instruction to continue its execution
li $t0, 0
while:
bgt $t0, 10, end_while # While $t0 is less than 10, keep iterating
addi $t0, $t0, 1 # Increment the value
j while # Jump back to the beginning of the loop
end_while:
# 2D Matrix Traversal
# Assume that $a0 stores the address of an integer matrix which is 3 x 3
li $t0, 0 # Counter for i
li $t1, 0 # Counter for j
matrix_row:
bgt $t0, 3, matrix_row_end
matrix_col:
bgt $t1, 3, matrix_col_end
# Do stuff
addi $t1, $t1, 1 # Increment the col counter
matrix_col_end:
# Do stuff
addi $t0, $t0, 1
matrix_row_end:
## FUNCTIONS ##
_functions:
# Functions are callable procedures that can accept arguments and return
values all denoted with labels, like above
main: # Programs begin with main func
jal return_1 # jal will store the current PC in $ra
# and then jump to return_1
# What if we want to pass in args?
# First we must pass in our parameters to the argument registers
li $a0, 1
li $a1, 2
jal sum # Now we can call the function
# How about recursion?
# This is a bit more work since we need to make sure we save and restore
# the previous PC in $ra since jal will automatically overwrite on each call
li $a0, 3
jal fact
li $v0, 10
syscall
# This function returns 1
return_1:
li $v0, 1 # Load val in return register $v0
jr $ra # Jump back to old PC to continue exec
# Function with 2 args
sum:
add $v0, $a0, $a1
jr $ra # Return
# Recursive function to find factorial
fact:
addi $sp, $sp, -8 # Allocate space in stack
sw $s0, ($sp) # Store reg that holds current num
sw $ra, 4($sp) # Store previous PC
li $v0, 1 # Init return value
beq $a0, 0, fact_done # Finish if param is 0
# Otherwise, continue recursion
move $s0, $a0 # Copy $a0 to $s0
sub $a0, $a0, 1
jal fact
mul $v0, $s0, $v0 # Multiplication is done
fact_done:
lw $s0, ($sp)
lw $ra, ($sp) # Restore the PC
addi $sp, $sp, 8
jr $ra
## MACROS ##
_macros:
# Macros are extremly useful for substituting repeated code blocks with a
# single label for better readability
# These are in no means substitutes for functions
# These must be declared before it is used
# Macro for printing new lines (since these can be very repetitive)
.macro println()
la $a0, newline # New line string stored here
li $v0, 4
syscall
.end_macro
println() # Assembler will copy that block of
# code here before running
# Parameters can be passed in through macros.
# These are denoted by a '%' sign with any name you choose
.macro print_int(%num)
li $v0, 1
lw $a0, %num
syscall
.end_macro
li $t0, 1
print_int($t0)
# We can also pass in immediates for macros
.macro immediates(%a, %b)
add $t0, %a, %b
.end_macro
immediates(3, 5)
# Along with passing in labels
.macro print(%string)
la $a0, %string
li $v0, 4
syscall
.end_macro
print(hello_world)
## ARRAYS ##
.data
list: .word 3, 0, 1, 2, 6 # This is an array of words
char_arr: .asciiz "hello" # This is a char array
buffer: .space 128 # Allocates a block in memory, does
# not automatically clear
# These blocks of memory are aligned
# next each other
.text
la $s0, list # Load address of list
li $t0, 0 # Counter
li $t1, 5 # Length of the list
loop:
bgt $t0, $t1, end_loop
lw $a0, ($s0)
li $v0, 1
syscall # Print the number
addi $s0, $s0, 4 # Size of a word is 4 bytes
addi $t0, $t0, 1 # Increment
j loop
end_loop:
## INCLUDE ##
# You do this to import external files into your program (behind the scenes,
# it really just takes whatever code that is in that file and places it where
# the include statement is)
.include "somefile.asm"
```

View File

@ -12,7 +12,7 @@ Markdown is gecreëerd door John Gruber in 2004. Het is bedoeld om met een gemak
schrijven syntax te zijn die gemakkelijk omgevormd kan worden naar HTML (en op heden verschillende
andere formaten)
```markdown
```md
<!-- Markdown erft over van HTML, dus ieder HTML bestand is een geldig Markdown
bestand. Dit betekend ook dat html elementen gebruikt kunnen worden in Markdown
zoals het commentaar element. Echter, als je een html element maakt in een Markdown

View File

@ -19,7 +19,7 @@ Outro livro recente e popular é o
[Land of Lisp](http://landoflisp.com/).
```common-lisp
```lisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 0. Sintaxe

View File

@ -14,7 +14,7 @@ escrever sintaxe que converte facilmente em HTML (hoje, suporta outros formatos
Dê-me feedback tanto quanto você quiser! / Sinta-se livre para a garfar (fork) e
puxar o projeto (pull request)
```markdown
```md
<!-- Markdown é um superconjunto do HTML, de modo que qualquer arvquivo HTML é
um arquivo Markdown válido, isso significa que nós podemos usar elementos HTML
em Markdown, como o elemento de comentário, e eles não serão afetados pelo analisador

View File

@ -8,7 +8,7 @@ lang: pt-br
filename: learnvisualbasic-pt.vb
---
```vb
```
Module Module1
module Module1

View File

@ -7,6 +7,7 @@ contributors:
- ["Zachary Ferguson", "http://github.com/zfergus2"]
- ["evuez", "http://github.com/evuez"]
- ["Rommel Martinez", "https://ebzzry.io"]
- ["Roberto Fernandez Diaz", "https://github.com/robertofd1995"]
filename: learnpython3.py
---
@ -352,6 +353,8 @@ valid_set = {(1,), 1}
# Add one more item to the set
filled_set = some_set
filled_set.add(5) # filled_set is now {1, 2, 3, 4, 5}
# Sets do not have duplicate elements
filled_set.add(5) # it remains as before {1, 2, 3, 4, 5}
# Do set intersection with &
other_set = {3, 4, 5, 6}

View File

@ -36,7 +36,7 @@ lang: ru-ru
Markdown является надмножеством HTML, поэтому любой HTML-файл является
корректным документом Markdown.
```markdown
```md
<!-- Это позволяет использовать напрямую
любые элементы HTML-разметки, такие, например, как этот комментарий.
Встроенные в документ HTML-элементы не затрагиваются парсером Markdown

View File

@ -16,19 +16,20 @@ contributors:
- ["Persa Zula", "http://persazula.com"]
- ["Jake Faris", "https://github.com/farisj"]
- ["Corey Ward", "https://github.com/coreyward"]
- ["Jannik Siebert", "https://github.com/janniks"]
---
```ruby
# This is a comment
# In Ruby, (almost) everything is an object.
# This includes numbers
# This includes numbers...
3.class #=> Integer
# …strings…
# ...and strings...
"Hello".class #=> String
# even methods!
# ...and even methods!
"Hello".method(:class).class #=> Method
# Some basic arithmetic
@ -67,7 +68,7 @@ false.class #=> FalseClass
1 != 1 #=> false
2 != 1 #=> true
# apart from false itself, nil is the only other 'falsey' value
# Apart from false itself, nil is the only other 'falsey' value
!!nil #=> false
!!false #=> false
@ -111,33 +112,33 @@ placeholder = 'use string interpolation'
'hello ' + 3.to_s #=> "hello 3"
"hello #{3}" #=> "hello 3"
# Combine strings and operators
# ...or combine strings and operators
'hello ' * 3 #=> "hello hello hello "
# Append to string
# ...or append to string
'hello' << ' world' #=> "hello world"
# print to the output with a newline at the end
# You can print to the output with a newline at the end
puts "I'm printing!"
#=> I'm printing!
#=> nil
# print to the output without a newline
# ...or print to the output without a newline
print "I'm printing!"
#=> I'm printing! => nil
#=> "I'm printing!" => nil
# Variables
x = 25 #=> 25
x #=> 25
# Note that assignment returns the value assigned
# This means you can do multiple assignment:
# Note that assignment returns the value assigned.
# This means you can do multiple assignment.
x = y = 10 #=> 10
x #=> 10
y #=> 10
# By convention, use snake_case for variable names
# By convention, use snake_case for variable names.
snake_case = true
# Use descriptive variable names
@ -146,7 +147,7 @@ m = '/bad/name/'
# Symbols are immutable, reusable constants represented internally by an
# integer value. They're often used instead of strings to efficiently convey
# specific, meaningful values
# specific, meaningful values.
:pending.class #=> Symbol
@ -158,82 +159,82 @@ status == 'pending' #=> false
status == :approved #=> false
Strings can be converted into symbols and vice versa:
# Strings can be converted into symbols and vice versa.
status.to_s #=> "pending"
"argon".to_sym #=> :argon
# Arrays
# This is an array
# This is an array.
array = [1, 2, 3, 4, 5] #=> [1, 2, 3, 4, 5]
# Arrays can contain different types of items
# Arrays can contain different types of items.
[1, 'hello', false] #=> [1, "hello", false]
# Arrays can be indexed
# From the front
# Arrays can be indexed.
# From the front...
array[0] #=> 1
array.first #=> 1
array[12] #=> nil
# Like arithmetic, [var] access
# is just syntactic sugar
# for calling a method [] on an object
array.[] 0 #=> 1
array.[] 12 #=> nil
# From the end
# ...or from the back...
array[-1] #=> 5
array.last #=> 5
# With a start index and length
# ...or with a start index and length...
array[2, 3] #=> [3, 4, 5]
# Reverse an Array
# ...or with a range...
array[1..3] #=> [2, 3, 4]
# You can reverse an Array.
a = [1,2,3]
a.reverse! #=> [3,2,1]
# Or with a range
array[1..3] #=> [2, 3, 4]
# Like arithmetic, [var] access is just syntactic sugar
# for calling a method '[]' on an object.
array.[] 0 #=> 1
array.[] 12 #=> nil
# Add to an array like this
# You can add to an array...
array << 6 #=> [1, 2, 3, 4, 5, 6]
# Or like this
array.push(6) #=> [1, 2, 3, 4, 5, 6]
# Check if an item exists in an array
# ...and check if an item exists in an array
array.include?(1) #=> true
# Hashes are Ruby's primary dictionary with key/value pairs.
# Hashes are denoted with curly braces:
# Hashes are denoted with curly braces.
hash = { 'color' => 'green', 'number' => 5 }
hash.keys #=> ['color', 'number']
# Hashes can be quickly looked up by key:
hash['color'] #=> 'green'
# Hashes can be quickly looked up by key.
hash['color'] #=> "green"
hash['number'] #=> 5
# Asking a hash for a key that doesn't exist returns nil:
# Asking a hash for a key that doesn't exist returns nil.
hash['nothing here'] #=> nil
# When using symbols for keys in a hash, you can use this alternate syntax:
# When using symbols for keys in a hash, you can use an alternate syntax.
new_hash = { defcon: 3, action: true }
hash = { :defcon => 3, :action => true }
hash.keys #=> [:defcon, :action]
new_hash.keys #=> [:defcon, :action]
hash = { defcon: 3, action: true }
hash.keys #=> [:defcon, :action]
# Check existence of keys and values in hash
new_hash.key?(:defcon) #=> true
new_hash.value?(3) #=> true
hash.key?(:defcon) #=> true
hash.value?(3) #=> true
# Tip: Both Arrays and Hashes are Enumerable
# They share a lot of useful methods such as each, map, count, and more
# Tip: Both Arrays and Hashes are Enumerable!
# They share a lot of useful methods such as each, map, count, and more.
# Control structures
# Conditionals
if true
'if statement'
elsif false
@ -242,28 +243,26 @@ else
'else, also optional'
end
# Loops
# In Ruby, traditional `for` loops aren't very common. Instead, these
# basic loops are implemented using enumerable, which hinges on `each`:
# basic loops are implemented using enumerable, which hinges on `each`.
(1..5).each do |counter|
puts "iteration #{counter}"
end
# Which is roughly equivalent to this, which is unusual to see in Ruby:
# Which is roughly equivalent to the following, which is unusual to see in Ruby.
for counter in 1..5
puts "iteration #{counter}"
end
# The `do |variable| ... end` construct above is called a “block”. Blocks are similar
# The `do |variable| ... end` construct above is called a 'block'. Blocks are similar
# to lambdas, anonymous functions or closures in other programming languages. They can
# be passed around as objects, called, or attached as methods.
#
# The "each" method of a range runs the block once for each element of the range.
# The 'each' method of a range runs the block once for each element of the range.
# The block is passed a counter as a parameter.
# You can also surround blocks in curly brackets:
# You can also surround blocks in curly brackets.
(1..5).each { |counter| puts "iteration #{counter}" }
# The contents of data structures can also be iterated using each.
@ -274,8 +273,8 @@ hash.each do |key, value|
puts "#{key} is #{value}"
end
# If you still need an index you can use "each_with_index" and define an index
# variable
# If you still need an index you can use 'each_with_index' and define an index
# variable.
array.each_with_index do |element, index|
puts "#{element} is number #{index} in the array"
end
@ -291,9 +290,9 @@ end
#=> iteration 4
#=> iteration 5
# There are a bunch of other helpful looping functions in Ruby,
# for example "map", "reduce", "inject", the list goes on. Map,
# for instance, takes the array it's looping over, does something
# There are a bunch of other helpful looping functions in Ruby.
# For example: 'map', 'reduce', 'inject', the list goes on.
# Map, for instance, takes the array it's looping over, does something
# to it as defined in your block, and returns an entirely new array.
array = [1,2,3,4,5]
doubled = array.map do |element|
@ -304,6 +303,7 @@ puts doubled
puts array
#=> [1,2,3,4,5]
# Case construct
grade = 'B'
case grade
@ -322,7 +322,7 @@ else
end
#=> "Better luck next time"
# cases can also use ranges
# Cases can also use ranges
grade = 82
case grade
when 90..100
@ -334,9 +334,9 @@ else
end
#=> "OK job"
# exception handling:
# Exception handling
begin
# code here that might raise an exception
# Code here that might raise an exception
raise NoMemoryError, 'You ran out of memory.'
rescue NoMemoryError => exception_variable
puts 'NoMemoryError was raised', exception_variable
@ -354,10 +354,10 @@ def double(x)
x * 2
end
# Methods (and blocks) implicitly return the value of the last statement
# Methods (and blocks) implicitly return the value of the last statement.
double(2) #=> 4
# Parentheses are optional where the interpretation is unambiguous
# Parentheses are optional where the interpretation is unambiguous.
double 3 #=> 6
double double 3 #=> 12
@ -366,15 +366,14 @@ def sum(x, y)
x + y
end
# Method arguments are separated by a comma
# Method arguments are separated by a comma.
sum 3, 4 #=> 7
sum sum(3, 4), 5 #=> 12
# yield
# All methods have an implicit, optional block parameter
# it can be called with the 'yield' keyword
# All methods have an implicit, optional block parameter.
# Tt can be called with the 'yield' keyword.
def surround
puts '{'
yield
@ -383,45 +382,43 @@ end
surround { puts 'hello world' }
# {
# hello world
# }
#=> {
#=> hello world
#=> }
# Blocks can be converted into a `proc` object, which wraps the block
# Blocks can be converted into a 'proc' object, which wraps the block
# and allows it to be passed to another method, bound to a different scope,
# or manipulated otherwise. This is most common in method parameter lists,
# where you frequently see a trailing `&block` parameter that will accept
# the block, if one is given, and convert it to a `Proc`. The naming here is
# convention; it would work just as well with `&pineapple`:
# where you frequently see a trailing '&block' parameter that will accept
# the block, if one is given, and convert it to a 'Proc'. The naming here is
# convention; it would work just as well with '&pineapple'.
def guests(&block)
block.class #=> Proc
block.call(4)
end
# The `call` method on the Proc is similar to calling `yield` when a block is
# present. The arguments passed to `call` will be forwarded to the block as arugments:
# The 'call' method on the Proc is similar to calling 'yield' when a block is
# present. The arguments passed to 'call' will be forwarded to the block as arugments.
guests { |n| "You have #{n} guests." }
# => "You have 4 guests."
# You can pass a list of arguments, which will be converted into an array
# That's what splat operator ("*") is for
# You can pass a list of arguments, which will be converted into an array.
# That's what splat operator ("*") is for.
def guests(*array)
array.each { |guest| puts guest }
end
# Destructuring
# Ruby will automatically destructure arrays on assignment to multiple variables:
# Ruby will automatically destructure arrays on assignment to multiple variables.
a, b, c = [1, 2, 3]
a #=> 1
b #=> 2
c #=> 3
# In some cases, you will want to use the splat operator: `*` to prompt destructuring
# of an array into a list:
# of an array into a list.
ranked_competitors = ["John", "Sally", "Dingus", "Moe", "Marcy"]
def best(first, second, third)
@ -430,7 +427,7 @@ end
best *ranked_competitors.first(3) #=> Winners are John, Sally, and Dingus.
# The splat operator can also be used in parameters:
# The splat operator can also be used in parameters.
def best(first, second, third, *others)
puts "Winners are #{first}, #{second}, and #{third}."
puts "There were #{others.count} other participants."
@ -440,21 +437,23 @@ best *ranked_competitors
#=> Winners are John, Sally, and Dingus.
#=> There were 2 other participants.
# By convention, all methods that return booleans end with a question mark
5.even? # false
5.odd? # true
# By convention, all methods that return booleans end with a question mark.
5.even? #=> false
5.odd? #=> true
# And if a method ends with an exclamation mark, it does something destructive
# By convention, if a method name ends with an exclamation mark, it does something destructive
# like mutate the receiver. Many methods have a ! version to make a change, and
# a non-! version to just return a new changed version
# a non-! version to just return a new changed version.
company_name = "Dunder Mifflin"
company_name.upcase #=> "DUNDER MIFFLIN"
company_name #=> "Dunder Mifflin"
company_name.upcase! # we're mutating company_name this time!
# We're mutating company_name this time.
company_name.upcase! #=> "DUNDER MIFFLIN"
company_name #=> "DUNDER MIFFLIN"
# Classes
# Define a class with the class keyword
# You can define a class with the 'class' keyword.
class Human
# A class variable. It is shared by all instances of this class.
@ -462,7 +461,7 @@ class Human
# Basic initializer
def initialize(name, age = 0)
# Assign the argument to the "name" instance variable for the instance
# Assign the argument to the 'name' instance variable for the instance.
@name = name
# If no age given, we will fall back to the default in the arguments list.
@age = age
@ -478,10 +477,10 @@ class Human
@name
end
# The above functionality can be encapsulated using the attr_accessor method as follows
# The above functionality can be encapsulated using the attr_accessor method as follows.
attr_accessor :name
# Getter/setter methods can also be created individually like this
# Getter/setter methods can also be created individually like this.
attr_reader :name
attr_writer :name
@ -496,13 +495,11 @@ class Human
end
end
# Instantiate a class
# Instantiating of a class
jim = Human.new('Jim Halpert')
dwight = Human.new('Dwight K. Schrute')
# Let's call a couple of methods
# You can call the methods of the generated object.
jim.species #=> "H. sapiens"
jim.name #=> "Jim Halpert"
jim.name = "Jim Halpert II" #=> "Jim Halpert II"
@ -510,30 +507,30 @@ jim.name #=> "Jim Halpert II"
dwight.species #=> "H. sapiens"
dwight.name #=> "Dwight K. Schrute"
# Call the class method
# Calling of a class method
Human.say('Hi') #=> "Hi"
# Variable's scopes are defined by the way we name them.
# Variables that start with $ have global scope
# Variables that start with $ have global scope.
$var = "I'm a global var"
defined? $var #=> "global-variable"
# Variables that start with @ have instance scope
# Variables that start with @ have instance scope.
@var = "I'm an instance var"
defined? @var #=> "instance-variable"
# Variables that start with @@ have class scope
# Variables that start with @@ have class scope.
@@var = "I'm a class var"
defined? @@var #=> "class variable"
# Variables that start with a capital letter are constants
# Variables that start with a capital letter are constants.
Var = "I'm a constant"
defined? Var #=> "constant"
# Class is also an object in ruby. So class can have instance variables.
# Class variable is shared among the class and all of its descendants.
# Class is also an object in ruby. So a class can have instance variables.
# A class variable is shared among the class and all of its descendants.
# base class
# Base class
class Human
@@foo = 0
@ -546,18 +543,17 @@ class Human
end
end
# derived class
# Derived class
class Worker < Human
end
Human.foo # 0
Worker.foo # 0
Human.foo #=> 0
Worker.foo #=> 0
Human.foo = 2 # 2
Worker.foo # 2
# Class instance variable is not shared by the class's descendants.
Human.foo = 2
Worker.foo #=> 2
# A class instance variable is not shared by the class's descendants.
class Human
@bar = 0
@ -573,8 +569,8 @@ end
class Doctor < Human
end
Human.bar # 0
Doctor.bar # nil
Human.bar #=> 0
Doctor.bar #=> nil
module ModuleExample
def foo
@ -582,9 +578,8 @@ module ModuleExample
end
end
# Including modules binds their methods to the class instances
# Extending modules binds their methods to the class itself
# Including modules binds their methods to the class instances.
# Extending modules binds their methods to the class itself.
class Person
include ModuleExample
end
@ -594,12 +589,11 @@ class Book
end
Person.foo #=> NoMethodError: undefined method `foo' for Person:Class
Person.new.foo # => 'foo'
Book.foo # => 'foo'
Person.new.foo #=> "foo"
Book.foo #=> "foo"
Book.new.foo #=> NoMethodError: undefined method `foo'
# Callbacks are executed when including and extending a module
module ConcernExample
def self.included(base)
base.extend(ClassMethods)
@ -623,10 +617,10 @@ class Something
include ConcernExample
end
Something.bar # => 'bar'
Something.bar #=> "bar"
Something.qux #=> NoMethodError: undefined method `qux'
Something.new.bar #=> NoMethodError: undefined method `bar'
Something.new.qux # => 'qux'
Something.new.qux #=> "qux"
```
## Additional resources

View File

@ -12,7 +12,7 @@ It is an alternative to YAML and JSON. It aims to be more human friendly than JS
Be warned, TOML's spec is still changing a lot. Until it's marked as 1.0, you
should assume that it is unstable and act accordingly. This document follows TOML v0.4.0.
```toml
```
# Comments in TOML look like this.
################

View File

@ -11,7 +11,7 @@ filename: markdown-tr.md
Markdown, 2004 yılında John Gruber tarafından oluşturuldu. Asıl amacı kolay okuma ve yazmayı sağlamakla beraber kolayca HTML (artık bir çok diğer formatlara) dönüşüm sağlamaktır.
```markdown
```md
<!-- Markdown, HTML'i kapsar, yani her HTML dosyası geçerli bir Markdown dosyasıdır, bu demektir
ki Markdown içerisinde HTML etiketleri kullanabiliriz, örneğin bu yorum elementi, ve
markdown işleyicisinde etki etmezler. Fakat, markdown dosyası içerisinde HTML elementi oluşturursanız,

View File

@ -0,0 +1,818 @@
---
language: python
lang: uk-ua
contributors:
- ["Louie Dinh", "http://ldinh.ca"]
- ["Amin Bandali", "https://aminb.org"]
- ["Andre Polykanine", "https://github.com/Oire"]
- ["evuez", "http://github.com/evuez"]
- ["asyne", "https://github.com/justblah"]
- ["habi", "http://github.com/habi"]
translators:
- ["Oleg Gromyak", "https://github.com/ogroleg"]
filename: learnpython-ua.py
---
Мову Python створив Гвідо ван Россум на початку 90-х. Наразі це одна з
найбільш популярних мов. Я закохався у Python завдяки простому і зрозумілому
синтаксису. Це майже як виконуваний псевдокод.
З вдячністю чекаю ваших відгуків: [@louiedinh](http://twitter.com/louiedinh)
або louiedinh [at] [поштовий сервіс від Google]
Примітка: Ця стаття стосується Python 2.7, проте має працювати і
у інших версіях Python 2.x. Python 2.7 підходить до кінця свого терміну,
його підтримку припинять у 2020, тож наразі краще починати вивчення Python
з версії 3.x.
Аби вивчити Python 3.x, звертайтесь до статті по Python 3.
```python
# Однорядкові коментарі починаються з символу решітки.
""" Текст, що займає декілька рядків,
може бути записаний з використанням 3 знаків " і
зазвичай використовується у якості
вбудованої документації
"""
####################################################
## 1. Примітивні типи даних та оператори
####################################################
# У вас є числа
3 # => 3
# Математика працює досить передбачувано
1 + 1 # => 2
8 - 1 # => 7
10 * 2 # => 20
35 / 5 # => 7
# А ось з діленням все трохи складніше. Воно цілочисельне і результат
# автоматично округлюється у меншу сторону.
5 / 2 # => 2
# Аби правильно ділити, спершу варто дізнатися про числа
# з плаваючою комою.
2.0 # Це число з плаваючою комою
11.0 / 4.0 # => 2.75 ох... Так набагато краще
# Результат цілочисельного ділення округлюється у меншу сторону
# як для додатніх, так і для від'ємних чисел.
5 // 3 # => 1
5.0 // 3.0 # => 1.0 # Працює і для чисел з плаваючою комою
-5 // 3 # => -2
-5.0 // 3.0 # => -2.0
# Зверніть увагу, що ми також можемо імпортувати модуль для ділення,
# див. розділ Модулі
# аби звичне ділення працювало при використанні лише '/'.
from __future__ import division
11 / 4 # => 2.75 ...звичне ділення
11 // 4 # => 2 ...цілочисельне ділення
# Залишок від ділення
7 % 3 # => 1
# Піднесення до степеня
2 ** 4 # => 16
# Приорітет операцій вказується дужками
(1 + 3) * 2 # => 8
# Логічні оператори
# Зверніть увагу: ключові слова «and» і «or» чутливі до регістру букв
True and False # => False
False or True # => True
# Завважте, що логічні оператори також використовуються і з цілими числами
0 and 2 # => 0
-5 or 0 # => -5
0 == False # => True
2 == True # => False
1 == True # => True
# Для заперечення використовується not
not True # => False
not False # => True
# Рівність — це ==
1 == 1 # => True
2 == 1 # => False
# Нерівність — це !=
1 != 1 # => False
2 != 1 # => True
# Ще трохи порівнянь
1 < 10 # => True
1 > 10 # => False
2 <= 2 # => True
2 >= 2 # => True
# Порівняння можуть бути записані ланцюжком!
1 < 2 < 3 # => True
2 < 3 < 2 # => False
# Рядки позначаються символом " або '
"Це рядок."
'Це теж рядок.'
# І рядки також можна додавати!
"Привіт " + "світ!" # => "Привіт світ!"
# Рядки можна додавати і без '+'
"Привіт " "світ!" # => "Привіт світ!"
# ... або множити
"Привіт" * 3 # => "ПривітПривітПривіт"
# З рядком можна працювати як зі списком символів
"Це рядок"[0] # => 'Ц'
# Ви можете дізнатися довжину рядка
len("Це рядок") # => 8
# Символ % використовується для форматування рядків, наприклад:
"%s можуть бути %s" % ("рядки", "інтерпольовані")
# Новий спосіб форматування рядків — використання методу format.
# Це бажаний спосіб.
"{} є {}".format("Це", "заповнювач")
"{0} можуть бути {1}".format("рядки", "форматовані")
# Якщо ви не хочете рахувати, то можете скористатися ключовими словами.
"{name} хоче з'істи {food}".format(name="Боб", food="лазанью")
# None - це об'єкт
None # => None
# Не використовуйте оператор рівності '=='' для порівняння
# об'єктів з None. Використовуйте для цього «is»
"etc" is None # => False
None is None # => True
# Оператор 'is' перевіряє ідентичність об'єктів. Він не
# дуже корисний при роботі з примітивними типами, проте
# незамінний при роботі з об'єктами.
# None, 0 і порожні рядки/списки рівні False.
# Всі інші значення рівні True
bool(0) # => False
bool("") # => False
####################################################
## 2. Змінні та колекції
####################################################
# В Python є оператор print
print "Я Python. Приємно познайомитись!" # => Я Python. Приємно познайомитись!
# Отримати дані з консолі просто
input_string_var = raw_input(
"Введіть щось: ") # Повертає дані у вигляді рядка
input_var = input("Введіть щось: ") # Працює з даними як з кодом на python
# Застереження: будьте обережні при використанні методу input()
# Оголошувати змінні перед ініціалізацією не потрібно.
some_var = 5 # За угодою використовується нижній_регістр_з_підкресленнями
some_var # => 5
# При спробі доступу до неініціалізованої змінної
# виникне виняткова ситуація.
# Див. розділ Потік управління, аби дізнатись про винятки більше.
some_other_var # Помилка в імені
# if може використовуватися як вираз
# Такий запис еквівалентний тернарному оператору '?:' у мові С
"yahoo!" if 3 > 2 else 2 # => "yahoo!"
# Списки зберігають послідовності
li = []
# Можна одразу створити заповнений список
other_li = [4, 5, 6]
# Об'єкти додаються у кінець списку за допомогою методу append
li.append(1) # li тепер дорівнює [1]
li.append(2) # li тепер дорівнює [1, 2]
li.append(4) # li тепер дорівнює [1, 2, 4]
li.append(3) # li тепер дорівнює [1, 2, 4, 3]
# І видаляються з кінця методом pop
li.pop() # => повертає 3 і li стає рівним [1, 2, 4]
# Повернемо елемент назад
li.append(3) # li тепер знову дорівнює [1, 2, 4, 3]
# Поводьтесь зі списком як зі звичайним масивом
li[0] # => 1
# Присвоюйте нові значення вже ініціалізованим індексам за допомогою =
li[0] = 42
li[0] # => 42
li[0] = 1 # Зверніть увагу: повертаємось до попереднього значення
# Звертаємось до останнього елементу
li[-1] # => 3
# Спроба вийти за границі масиву призводить до помилки в індексі
li[4] # помилка в індексі
# Можна звертатися до діапазону, використовуючи так звані зрізи
# (Для тих, хто любить математику: це називається замкнуто-відкритий інтервал).
li[1:3] # => [2, 4]
# Опускаємо початок
li[2:] # => [4, 3]
# Опускаємо кінець
li[:3] # => [1, 2, 4]
# Вибираємо кожен другий елемент
li[::2] # => [1, 4]
# Перевертаємо список
li[::-1] # => [3, 4, 2, 1]
# Використовуйте суміш вищеназваного для більш складних зрізів
# li[початок:кінець:крок]
# Видаляємо довільні елементи зі списку оператором del
del li[2] # li тепер [1, 2, 3]
# Ви можете додавати списки
li + other_li # => [1, 2, 3, 4, 5, 6]
# Зверніть увагу: значення li та other_li при цьому не змінились.
# Поєднувати списки можна за допомогою методу extend
li.extend(other_li) # Тепер li дорівнює [1, 2, 3, 4, 5, 6]
# Видалити перше входження значення
li.remove(2) # Тепер li дорівнює [1, 3, 4, 5, 6]
li.remove(2) # Помилка значення, оскільки у списку li немає 2
# Вставити елемент за вказаним індексом
li.insert(1, 2) # li знову дорівнює [1, 2, 3, 4, 5, 6]
# Отримати індекс першого знайденого елементу
li.index(2) # => 1
li.index(7) # Помилка значення, оскільки у списку li немає 7
# Перевірити елемент на входження у список можна оператором in
1 in li # => True
# Довжина списку обчислюється за допомогою функції len
len(li) # => 6
# Кортежі схожі на списки, лише незмінні
tup = (1, 2, 3)
tup[0] # => 1
tup[0] = 3 # Виникає помилка типу
# Все те ж саме можна робити і з кортежами
len(tup) # => 3
tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6)
tup[:2] # => (1, 2)
2 in tup # => True
# Ви можете розпаковувати кортежі (або списки) у змінні
a, b, c = (1, 2, 3) # a == 1, b == 2 и c == 3
d, e, f = 4, 5, 6 # дужки можна опустити
# Кортежі створюються за замовчуванням, якщо дужки опущено
g = 4, 5, 6 # => (4, 5, 6)
# Дивіться, як легко обміняти значення двох змінних
e, d = d, e # тепер d дорівнює 5, а e дорівнює 4
# Словники містять асоціативні масиви
empty_dict = {}
# Ось так описується попередньо заповнений словник
filled_dict = {"one": 1, "two": 2, "three": 3}
# Значення можна отримати так само, як і зі списку
filled_dict["one"] # => 1
# Можна отримати всі ключі у виді списку за допомогою методу keys
filled_dict.keys() # => ["three", "two", "one"]
# Примітка: збереження порядку ключів у словників не гарантується
# Ваші результати можуть не співпадати з цими.
# Можна отримати і всі значення у вигляді списку, використовуйте метод values
filled_dict.values() # => [3, 2, 1]
# Те ж зауваження щодо порядку ключів діє і тут
# Отримуйте всі пари ключ-значення у вигляді списку кортежів
# за допомогою "items()"
filled_dict.items() # => [("one", 1), ("two", 2), ("three", 3)]
# За допомогою оператору in можна перевіряти ключі на входження у словник
"one" in filled_dict # => True
1 in filled_dict # => False
# Спроба отримати значення за неіснуючим ключем викине помилку ключа
filled_dict["four"] # помилка ключа
# Аби уникнути цього, використовуйте метод get()
filled_dict.get("one") # => 1
filled_dict.get("four") # => None
# Метод get також приймає аргумент за замовчуванням, значення якого буде
# повернуто при відсутності вказаного ключа
filled_dict.get("one", 4) # => 1
filled_dict.get("four", 4) # => 4
# Зверніть увагу, що filled_dict.get("four") все ще => None
# (get не встановлює значення елементу словника)
# Присвоюйте значення ключам так само, як і в списках
filled_dict["four"] = 4 # тепер filled_dict["four"] => 4
# Метод setdefault() вставляє пару ключ-значення лише
# за відсутності такого ключа
filled_dict.setdefault("five", 5) # filled_dict["five"] повертає 5
filled_dict.setdefault("five", 6) # filled_dict["five"] все ще повертає 5
# Множини містять... ну, загалом, множини
# (які схожі на списки, проте в них не може бути елементів, які повторюються)
empty_set = set()
# Ініціалізація множини набором значень
some_set = set([1,2,2,3,4]) # some_set тепер дорівнює set([1, 2, 3, 4])
# Порядок не гарантовано, хоча інколи множини виглядають відсортованими
another_set = set([4, 3, 2, 2, 1]) # another_set тепер set([1, 2, 3, 4])
# Починаючи з Python 2.7, ви можете використовувати {}, аби створити множину
filled_set = {1, 2, 2, 3, 4} # => {1, 2, 3, 4}
# Додавання нових елементів у множину
filled_set.add(5) # filled_set тепер дорівнює {1, 2, 3, 4, 5}
# Перетин множин: &
other_set = {3, 4, 5, 6}
filled_set & other_set # => {3, 4, 5}
# Об'єднання множин: |
filled_set | other_set # => {1, 2, 3, 4, 5, 6}
# Різниця множин: -
{1,2,3,4} - {2,3,5} # => {1, 4}
# Симетрична різниця множин: ^
{1, 2, 3, 4} ^ {2, 3, 5} # => {1, 4, 5}
# Перевіряємо чи множина зліва є надмножиною множини справа
{1, 2} >= {1, 2, 3} # => False
# Перевіряємо чи множина зліва є підмножиною множини справа
{1, 2} <= {1, 2, 3} # => True
# Перевірка на входження у множину: in
2 in filled_set # => True
10 in filled_set # => False
####################################################
## 3. Потік управління
####################################################
# Для початку створимо змінну
some_var = 5
# Так виглядає вираз if. Відступи у python дуже важливі!
# результат: «some_var менше, ніж 10»
if some_var > 10:
print("some_var набагато більше, ніж 10.")
elif some_var < 10: # Вираз elif є необов'язковим.
print("some_var менше, ніж 10.")
else: # Це теж необов'язково.
print("some_var дорівнює 10.")
"""
Цикли For проходять по спискам
Результат:
собака — це ссавець
кішка — це ссавець
миша — це ссавець
"""
for animal in ["собака", "кішка", "миша"]:
# Можете використовувати оператор {0} для інтерполяції форматованих рядків
print "{0} — це ссавець".format(animal)
"""
"range(число)" повертає список чисел
від нуля до заданого числа
Друкує:
0
1
2
3
"""
for i in range(4):
print(i)
"""
"range(нижня_границя, верхня_границя)" повертає список чисел
від нижньої границі до верхньої
Друкує:
4
5
6
7
"""
for i in range(4, 8):
print i
"""
Цикли while продовжуються до тих пір, поки вказана умова не стане хибною.
Друкує:
0
1
2
3
"""
x = 0
while x < 4:
print(x)
x += 1 # Короткий запис для x = x + 1
# Обробляйте винятки блоками try/except
# Працює у Python 2.6 і вище:
try:
# Аби створити виняток, використовується raise
raise IndexError("Помилка у індексі!")
except IndexError as e:
pass # pass — оператор, який нічого не робить. Зазвичай тут відбувається
# відновлення після помилки.
except (TypeError, NameError):
pass # Винятки можна обробляти групами, якщо потрібно.
else: # Необов'язковий вираз. Має слідувати за останнім блоком except
print("Все добре!") # Виконається лише якщо не було ніяких винятків
finally: # Виконується у будь-якому випадку
print "Тут ми можемо звільнити ресурси"
# Замість try/finally для звільнення ресурсів
# ви можете використовувати вираз with
with open("myfile.txt") as f:
for line in f:
print line
####################################################
## 4. Функції
####################################################
# Використовуйте def для створення нових функцій
def add(x, y):
print "x дорівнює {0}, а y дорівнює {1}".format(x, y)
return x + y # Повертайте результат за допомогою ключового слова return
# Виклик функції з аргументами
add(5, 6) # => друкує «x дорівнює 5, а y дорівнює 6» і повертає 11
# Інший спосіб виклику функції — виклик з іменованими аргументами
add(y=6, x=5) # Іменовані аргументи можна вказувати у будь-якому порядку
# Ви можете визначити функцію, яка приймає змінну кількість аргументів,
# які будуть інтерпретовані як кортеж, за допомогою *
def varargs(*args):
return args
varargs(1, 2, 3) # => (1,2,3)
# А також можете визначити функцію, яка приймає змінне число
# іменованих аргументів, котрі будуть інтерпретовані як словник, за допомогою **
def keyword_args(**kwargs):
return kwargs
# Давайте подивимось що з цього вийде
keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"}
# Якщо хочете, можете використовувати обидва способи одночасно
def all_the_args(*args, **kwargs):
print(args)
print(kwargs)
"""
all_the_args(1, 2, a=3, b=4) друкує:
(1, 2)
{"a": 3, "b": 4}
"""
# Коли викликаєте функції, то можете зробити навпаки!
# Використовуйте символ * аби розпакувати позиційні аргументи і
# ** для іменованих аргументів
args = (1, 2, 3, 4)
kwargs = {"a": 3, "b": 4}
all_the_args(*args) # еквівалентно foo(1, 2, 3, 4)
all_the_args(**kwargs) # еквівалентно foo(a=3, b=4)
all_the_args(*args, **kwargs) # еквівалентно foo(1, 2, 3, 4, a=3, b=4)
# ви можете передавати довільне число позиційних або іменованих аргументів
# іншим функціям, які їх приймають, розпаковуючи за допомогою
# * або ** відповідно
def pass_all_the_args(*args, **kwargs):
all_the_args(*args, **kwargs)
print varargs(*args)
print keyword_args(**kwargs)
# Область визначення функцій
x = 5
def set_x(num):
# Локальна змінна x - не те ж саме, що глобальна змінна x
x = num # => 43
print x # => 43
def set_global_x(num):
global x
print x # => 5
x = num # глобальна змінна x тепер дорівнює 6
print x # => 6
set_x(43)
set_global_x(6)
# В Python функції є об'єктами першого класу
def create_adder(x):
def adder(y):
return x + y
return adder
add_10 = create_adder(10)
add_10(3) # => 13
# Також є і анонімні функції
(lambda x: x > 2)(3) # => True
(lambda x, y: x ** 2 + y ** 2)(2, 1) # => 5
# Присутні вбудовані функції вищого порядку
map(add_10, [1, 2, 3]) # => [11, 12, 13]
map(max, [1, 2, 3], [4, 2, 1]) # => [4, 2, 3]
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7]
# Для зручного відображення і фільтрації можна використовувати
# включення у вигляді списків
[add_10(i) for i in [1, 2, 3]] # => [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7]
# Ви також можете скористатися включеннями множин та словників
{x for x in 'abcddeef' if x in 'abc'} # => {'a', 'b', 'c'}
{x: x ** 2 for x in range(5)} # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
####################################################
## 5. Класи
####################################################
# Аби отримати клас, ми наслідуємо object.
class Human(object):
# Атрибут класу. Він розділяється всіма екземплярами цього класу.
species = "H. sapiens"
# Звичайний конструктор, буде викликаний при ініціалізації екземпляру класу
# Зверніть увагу, що подвійне підкреслення на початку та наприкінці імені
# використовується для позначення об'єктів та атрибутів,
# які використовуються Python, але знаходяться у просторах імен,
# якими керує користувач. Не варто вигадувати для них імена самостійно.
def __init__(self, name):
# Присвоєння значення аргумента атрибуту класу name
self.name = name
# Ініціалізуємо властивість
self.age = 0
# Метод екземпляру. Всі методи приймають self у якості першого аргументу
def say(self, msg):
return "%s: %s" % (self.name, msg)
# Методи класу розділяються між усіма екземплярами
# Вони викликаються з вказанням викликаючого класу
# у якості першого аргументу
@classmethod
def get_species(cls):
return cls.species
# Статичний метод викликається без посилання на клас або екземпляр
@staticmethod
def grunt():
return "*grunt*"
# Властивість.
# Перетворює метод age() в атрибут тільки для читання
# з таким же ім'ям.
@property
def age(self):
return self._age
# Це дозволяє змінювати значення властивості
@age.setter
def age(self, age):
self._age = age
# Це дозволяє видаляти властивість
@age.deleter
def age(self):
del self._age
# Створюємо екземпляр класу
i = Human(name="Данило")
print(i.say("привіт")) # Друкує: «Данило: привіт»
j = Human("Меланка")
print(j.say("Привіт")) # Друкує: «Меланка: привіт»
# Виклик методу класу
i.get_species() # => "H. sapiens"
# Зміна розділюваного атрибуту
Human.species = "H. neanderthalensis"
i.get_species() # => "H. neanderthalensis"
j.get_species() # => "H. neanderthalensis"
# Виклик статичного методу
Human.grunt() # => "*grunt*"
# Оновлюємо властивість
i.age = 42
# Отримуємо значення
i.age # => 42
# Видаляємо властивість
del i.age
i.age # => виникає помилка атрибуту
####################################################
## 6. Модулі
####################################################
# Ви можете імпортувати модулі
import math
print(math.sqrt(16)) # => 4
# Ви можете імпортувати окремі функції з модуля
from math import ceil, floor
print(ceil(3.7)) # => 4.0
print(floor(3.7)) # => 3.0
# Можете імпортувати всі функції модуля.
# Попередження: краще так не робіть
from math import *
# Можете скорочувати імена модулів
import math as m
math.sqrt(16) == m.sqrt(16) # => True
# Ви також можете переконатися, що функції еквівалентні
from math import sqrt
math.sqrt == m.sqrt == sqrt # => True
# Модулі в Python — це звичайні Python-файли. Ви
# можете писати свої модулі та імпортувати їх. Назва
# модуля співпадає з назвою файлу.
# Ви можете дізнатися, які функції та атрибути визначені
# в модулі
import math
dir(math)
# Якщо у вас є Python скрипт з назвою math.py у тій же папці, що
# і ваш поточний скрипт, то файл math.py
# може бути завантажено замість вбудованого у Python модуля.
# Так трапляється, оскільки локальна папка має перевагу
# над вбудованими у Python бібліотеками.
####################################################
## 7. Додатково
####################################################
# Генератори
# Генератор "генерує" значення тоді, коли вони запитуються, замість того,
# щоб зберігати все одразу
# Метод нижче (*НЕ* генератор) подвоює всі значення і зберігає їх
# в `double_arr`. При великих розмірах може знадобитися багато ресурсів!
def double_numbers(iterable):
double_arr = []
for i in iterable:
double_arr.append(i + i)
return double_arr
# Тут ми спочатку подвоюємо всі значення, потім повертаємо їх,
# аби перевірити умову
for value in double_numbers(range(1000000)): # `test_non_generator`
print value
if value > 5:
break
# Натомість ми можемо скористатися генератором, аби "згенерувати"
# подвійне значення, як тільки воно буде запитане
def double_numbers_generator(iterable):
for i in iterable:
yield i + i
# Той самий код, але вже з генератором, тепер дозволяє нам пройтися по
# значенням і подвоювати їх одне за одним якраз тоді, коли вони обробляються
# за нашою логікою, одне за одним. А як тільки ми бачимо, що value > 5, ми
# виходимо з циклу і більше не подвоюємо більшість значень,
# які отримали на вхід (НАБАГАТО ШВИДШЕ!)
for value in double_numbers_generator(xrange(1000000)): # `test_generator`
print value
if value > 5:
break
# Між іншим: ви помітили використання `range` у `test_non_generator` і
# `xrange` у `test_generator`?
# Як `double_numbers_generator` є версією-генератором `double_numbers`, так
# і `xrange` є аналогом `range`, але у вигляді генератора.
# `range` поверне нам масив з 1000000 значень
# `xrange`, у свою чергу, згенерує 1000000 значень для нас тоді,
# коли ми їх запитуємо / будемо проходитись по ним.
# Аналогічно включенням у вигляді списків, ви можете створювати включення
# у вигляді генераторів.
values = (-x for x in [1, 2, 3, 4, 5])
for x in values:
print(x) # друкує -1 -2 -3 -4 -5
# Включення у вигляді генератора можна явно перетворити у список
values = (-x for x in [1, 2, 3, 4, 5])
gen_to_list = list(values)
print(gen_to_list) # => [-1, -2, -3, -4, -5]
# Декоратори
# Декоратор це функція вищого порядку, яка приймає та повертає функцію.
# Простий приклад використання декоратор add_apples додає елемент 'Apple' в
# список fruits, який повертає цільова функція get_fruits.
def add_apples(func):
def get_fruits():
fruits = func()
fruits.append('Apple')
return fruits
return get_fruits
@add_apples
def get_fruits():
return ['Banana', 'Mango', 'Orange']
# Друкуємо список разом з елементом 'Apple', який знаходиться в ньому:
# Banana, Mango, Orange, Apple
print ', '.join(get_fruits())
# У цьому прикладі beg обертає say
# Beg викличе say. Якщо say_please дорівнюватиме True, то повідомлення,
# що повертається, буде змінено.
from functools import wraps
def beg(target_function):
@wraps(target_function)
def wrapper(*args, **kwargs):
msg, say_please = target_function(*args, **kwargs)
if say_please:
return "{} {}".format(msg, "Будь ласка! Я бідний :(")
return msg
return wrapper
@beg
def say(say_please=False):
msg = "Ви можете купити мені пива?"
return msg, say_please
print say() # Ви можете купити мені пива?
print say(say_please=True) # Ви можете купити мені пива? Будь ласка! Я бідний :(
```
## Готові до більшого?
### Безкоштовні онлайн-матеріали
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
* [Dive Into Python](http://www.diveintopython.net/)
* [Официальная документация](http://docs.python.org/2.6/)
* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/)
* [Python Module of the Week](http://pymotw.com/2/)
* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182)
### Платні
* [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20)
* [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20)
* [Python Essential Reference](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20)

View File

@ -5,7 +5,7 @@ contributors:
filename: learnvisualbasic.vb
---
```vbnet
```
Module Module1
Sub Main()

View File

@ -41,7 +41,7 @@ enum days {SUN = 1, MON, TUE, WED, THU, FRI, SAT};
void function_1(char c);
void function_2(void);
// 如果函数出现在main()之后那么必须在main()之前
// 如果函数调用在main()之后那么必须在main()之前
// 先声明一个函数原型
int add_two_ints(int x1, int x2); // 函数原型

View File

@ -8,7 +8,7 @@ lang: zh-cn
filename: learnvisualbasic-cn.vb
---
```vbnet
```
Module Module1
Sub Main()