mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2025-05-05 14:28:31 +00:00
Merge remote-tracking branch 'refs/remotes/adambard/master'
This commit is contained in:
commit
57053bc95d
@ -51,7 +51,7 @@ Long version:
|
|||||||
### Header configuration
|
### Header configuration
|
||||||
|
|
||||||
The actual site uses Middleman to generate HTML files from these Markdown ones. Middleman, or at least
|
The actual site uses Middleman to generate HTML files from these Markdown ones. Middleman, or at least
|
||||||
the custom scripts underpinning the site, required that some key information be defined in the header.
|
the custom scripts underpinning the site, requires that some key information be defined in the header.
|
||||||
|
|
||||||
The following fields are necessary for English articles about programming languages:
|
The following fields are necessary for English articles about programming languages:
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ echo Hello, $Name!
|
|||||||
|
|
||||||
# We have the usual if structure:
|
# We have the usual if structure:
|
||||||
# use 'man test' for more info about conditionals
|
# use 'man test' for more info about conditionals
|
||||||
if [ $Name -ne $USER ]
|
if [ $Name != $USER ]
|
||||||
then
|
then
|
||||||
echo "Your name isn't your username"
|
echo "Your name isn't your username"
|
||||||
else
|
else
|
||||||
@ -91,12 +91,12 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# NOTE: if $Name is empty, bash sees the above condition as:
|
# NOTE: if $Name is empty, bash sees the above condition as:
|
||||||
if [ -ne $USER ]
|
if [ != $USER ]
|
||||||
# which is invalid syntax
|
# which is invalid syntax
|
||||||
# so the "safe" way to use potentially empty variables in bash is:
|
# so the "safe" way to use potentially empty variables in bash is:
|
||||||
if [ "$Name" -ne $USER ] ...
|
if [ "$Name" != $USER ] ...
|
||||||
# which, when $Name is empty, is seen by bash as:
|
# which, when $Name is empty, is seen by bash as:
|
||||||
if [ "" -ne $USER ] ...
|
if [ "" != $USER ] ...
|
||||||
# which works as expected
|
# which works as expected
|
||||||
|
|
||||||
# There is also conditional execution
|
# There is also conditional execution
|
||||||
|
@ -820,6 +820,76 @@ std::map<Foo, int, compareFunction> fooMap;
|
|||||||
fooMap[Foo(1)] = 1;
|
fooMap[Foo(1)] = 1;
|
||||||
fooMap.find(Foo(1)); //true
|
fooMap.find(Foo(1)); //true
|
||||||
|
|
||||||
|
///////////////////////////////////////
|
||||||
|
// Lambda Expressions (C++11 and above)
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
// lambdas are a convenient way of defining an anonymous function
|
||||||
|
// object right at the location where it is invoked or passed as
|
||||||
|
// an argument to a function.
|
||||||
|
|
||||||
|
// For example, consider sorting a vector of pairs using the second
|
||||||
|
// value of the pair
|
||||||
|
|
||||||
|
vector<pair<int, int> > tester;
|
||||||
|
tester.push_back(make_pair(3, 6));
|
||||||
|
tester.push_back(make_pair(1, 9));
|
||||||
|
tester.push_back(make_pair(5, 0));
|
||||||
|
|
||||||
|
// Pass a lambda expression as third argument to the sort function
|
||||||
|
// sort is from the <algorithm> header
|
||||||
|
|
||||||
|
sort(tester.begin(), tester.end(), [](const pair<int, int>& lhs, const pair<int, int>& rhs) {
|
||||||
|
return lhs.second < rhs.second;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Notice the syntax of the lambda expression,
|
||||||
|
// [] in the lambda is used to "capture" variables
|
||||||
|
// The "Capture List" defines what from the outside of the lambda should be available inside the function body and how.
|
||||||
|
// It can be either:
|
||||||
|
// 1. a value : [x]
|
||||||
|
// 2. a reference : [&x]
|
||||||
|
// 3. any variable currently in scope by reference [&]
|
||||||
|
// 4. same as 3, but by value [=]
|
||||||
|
// Example:
|
||||||
|
|
||||||
|
vector<int> dog_ids;
|
||||||
|
// number_of_dogs = 3;
|
||||||
|
for(int i = 0; i < 3; i++) {
|
||||||
|
dog_ids.push_back(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
int weight[3] = {30, 50, 10};
|
||||||
|
|
||||||
|
// Say you want to sort dog_ids according to the dogs' weights
|
||||||
|
// So dog_ids should in the end become: [2, 0, 1]
|
||||||
|
|
||||||
|
// Here's where lambda expressions come in handy
|
||||||
|
|
||||||
|
sort(dog_ids.begin(), dog_ids.end(), [&weight](const int &lhs, const int &rhs) {
|
||||||
|
return weight[lhs] < weight[rhs];
|
||||||
|
});
|
||||||
|
// Note we captured "weight" by reference in the above example.
|
||||||
|
// More on Lambdas in C++ : http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// Range For (C++11 and above)
|
||||||
|
///////////////////////////////
|
||||||
|
|
||||||
|
// You can use a range for loop to iterate over a container
|
||||||
|
int arr[] = {1, 10, 3};
|
||||||
|
|
||||||
|
for(int elem: arr){
|
||||||
|
cout << elem << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// You can use "auto" and not worry about the type of the elements of the container
|
||||||
|
// For example:
|
||||||
|
|
||||||
|
for(auto elem: arr) {
|
||||||
|
// Do something with each element of arr
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////
|
/////////////////////
|
||||||
// Fun stuff
|
// Fun stuff
|
||||||
/////////////////////
|
/////////////////////
|
||||||
|
@ -239,7 +239,7 @@ int main (int argc, char** argv)
|
|||||||
z = (e > f) ? e : f; // => 10 "if e > f return e, else return f."
|
z = (e > f) ? e : f; // => 10 "if e > f return e, else return f."
|
||||||
|
|
||||||
// Increment and decrement operators:
|
// Increment and decrement operators:
|
||||||
char *s = "iLoveC";
|
char *s = "ILoveC";
|
||||||
int j = 0;
|
int j = 0;
|
||||||
s[j++]; // => "i". Returns the j-th item of s THEN increments value of j.
|
s[j++]; // => "i". Returns the j-th item of s THEN increments value of j.
|
||||||
j = 0;
|
j = 0;
|
||||||
@ -313,9 +313,15 @@ int main (int argc, char** argv)
|
|||||||
case 1:
|
case 1:
|
||||||
printf("Huh, 'a' equals 1!\n");
|
printf("Huh, 'a' equals 1!\n");
|
||||||
break;
|
break;
|
||||||
|
// Be careful - without a "break", execution continues until the
|
||||||
|
// next "break" is reached.
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
printf("Look at that.. 'a' is either 3, or 4\n");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// if `some_integral_expression` didn't match any of the labels
|
// if `some_integral_expression` didn't match any of the labels
|
||||||
fputs("error!\n", stderr);
|
fputs("Error!\n", stderr);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -491,7 +497,7 @@ int add_two_ints(int x1, int x2)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Functions are call by value. When a function is called, the arguments passed to
|
Functions are call by value. When a function is called, the arguments passed to
|
||||||
≈the function are copies of the original arguments (except arrays). Anything you
|
the function are copies of the original arguments (except arrays). Anything you
|
||||||
do to the arguments in the function do not change the value of the original
|
do to the arguments in the function do not change the value of the original
|
||||||
argument where the function was called.
|
argument where the function was called.
|
||||||
|
|
||||||
@ -720,7 +726,7 @@ Header files are an important part of c as they allow for the connection of c
|
|||||||
source files and can simplify code and definitions by seperating them into
|
source files and can simplify code and definitions by seperating them into
|
||||||
seperate files.
|
seperate files.
|
||||||
|
|
||||||
Header files are syntaxtically similar to c source files but reside in ".h"
|
Header files are syntactically similar to c source files but reside in ".h"
|
||||||
files. They can be included in your c source file by using the precompiler
|
files. They can be included in your c source file by using the precompiler
|
||||||
command #include "example.h", given that example.h exists in the same directory
|
command #include "example.h", given that example.h exists in the same directory
|
||||||
as the c file.
|
as the c file.
|
||||||
|
@ -233,40 +233,38 @@ ColdFusion started as a tag-based language. Almost all functionality is availabl
|
|||||||
|
|
||||||
<em>Code for reference (Functions must return something to support IE)</em>
|
<em>Code for reference (Functions must return something to support IE)</em>
|
||||||
|
|
||||||
<pre>
|
<cfcomponent>
|
||||||
<cfcomponent>
|
<cfset this.hello = "Hello" />
|
||||||
<cfset this.hello = "Hello" />
|
<cfset this.world = "world" />
|
||||||
<cfset this.world = "world" />
|
|
||||||
|
|
||||||
<cffunction name="sayHello">
|
<cffunction name="sayHello">
|
||||||
<cfreturn this.hello & ", " & this.world & "!" />
|
<cfreturn this.hello & ", " & this.world & "!" />
|
||||||
</cffunction>
|
</cffunction>
|
||||||
|
|
||||||
<cffunction name="setHello">
|
<cffunction name="setHello">
|
||||||
<cfargument name="newHello" type="string" required="true" />
|
<cfargument name="newHello" type="string" required="true" />
|
||||||
|
|
||||||
<cfset this.hello = arguments.newHello />
|
<cfset this.hello = arguments.newHello />
|
||||||
|
|
||||||
<cfreturn true />
|
<cfreturn true />
|
||||||
</cffunction>
|
</cffunction>
|
||||||
|
|
||||||
<cffunction name="setWorld">
|
<cffunction name="setWorld">
|
||||||
<cfargument name="newWorld" type="string" required="true" />
|
<cfargument name="newWorld" type="string" required="true" />
|
||||||
|
|
||||||
<cfset this.world = arguments.newWorld />
|
<cfset this.world = arguments.newWorld />
|
||||||
|
|
||||||
<cfreturn true />
|
<cfreturn true />
|
||||||
</cffunction>
|
</cffunction>
|
||||||
|
|
||||||
<cffunction name="getHello">
|
<cffunction name="getHello">
|
||||||
<cfreturn this.hello />
|
<cfreturn this.hello />
|
||||||
</cffunction>
|
</cffunction>
|
||||||
|
|
||||||
<cffunction name="getWorld">
|
<cffunction name="getWorld">
|
||||||
<cfreturn this.world />
|
<cfreturn this.world />
|
||||||
</cffunction>
|
</cffunction>
|
||||||
</cfcomponent>
|
</cfcomponent>
|
||||||
</pre>
|
|
||||||
|
|
||||||
<cfset this.hello = "Hello" />
|
<cfset this.hello = "Hello" />
|
||||||
<cfset this.world = "world" />
|
<cfset this.world = "world" />
|
||||||
|
@ -339,7 +339,7 @@ nil ; for false - and the empty list
|
|||||||
|
|
||||||
;; The () in the above is the list of arguments for the function
|
;; The () in the above is the list of arguments for the function
|
||||||
(defun hello (name)
|
(defun hello (name)
|
||||||
(format nil "Hello, ~a " name))
|
(format nil "Hello, ~a" name))
|
||||||
|
|
||||||
(hello "Steve") ; => "Hello, Steve"
|
(hello "Steve") ; => "Hello, Steve"
|
||||||
|
|
||||||
@ -430,7 +430,7 @@ nil ; for false - and the empty list
|
|||||||
(defun walker (n)
|
(defun walker (n)
|
||||||
(if (zerop n)
|
(if (zerop n)
|
||||||
:walked
|
:walked
|
||||||
(walker (1- n))))
|
(walker (- n 1))))
|
||||||
|
|
||||||
(walker 5) ; => :walked
|
(walker 5) ; => :walked
|
||||||
|
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
---
|
---
|
||||||
language: markdown
|
language: markdown
|
||||||
|
lang: cs-cz
|
||||||
contributors:
|
contributors:
|
||||||
- ["Dan Turkel", "http://danturkel.com/"]
|
- ["Dan Turkel", "http://danturkel.com/"]
|
||||||
translators:
|
translators:
|
||||||
- ["Michal Martinek", "https://github.com/MichalMartinek"]
|
- ["Michal Martinek", "https://github.com/MichalMartinek"]
|
||||||
filename: markdown.md
|
filename: markdown.md
|
||||||
|
lang: cs-cz
|
||||||
---
|
---
|
||||||
|
|
||||||
Markdown byl vytvořen Johnem Gruberem v roce 2004. Je zamýšlen jako lehce čitelná
|
Markdown byl vytvořen Johnem Gruberem v roce 2004. Je zamýšlen jako lehce čitelná
|
||||||
|
@ -630,7 +630,7 @@ on a new line! ""Wow!"", the masses cried";
|
|||||||
|
|
||||||
public static class Extensions
|
public static class Extensions
|
||||||
{
|
{
|
||||||
// EXTENSION FUNCTIONS
|
// EXTENSION METHODS
|
||||||
public static void Print(this object obj)
|
public static void Print(this object obj)
|
||||||
{
|
{
|
||||||
Console.WriteLine(obj.ToString());
|
Console.WriteLine(obj.ToString());
|
||||||
|
@ -254,7 +254,7 @@ void main() {
|
|||||||
// Use an index, access every array element by reference (because we're
|
// Use an index, access every array element by reference (because we're
|
||||||
// going to change each element) and just call parallel on the array!
|
// going to change each element) and just call parallel on the array!
|
||||||
foreach(i, ref elem; parallel(arr)) {
|
foreach(i, ref elem; parallel(arr)) {
|
||||||
ref = sqrt(i + 1.0);
|
elem = sqrt(i + 1.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -6,19 +6,19 @@ contributors:
|
|||||||
- ["Sricharan Chiruvolu", "http://sricharan.xyz"]
|
- ["Sricharan Chiruvolu", "http://sricharan.xyz"]
|
||||||
translators:
|
translators:
|
||||||
- ["Moritz Kammerer", "https://github.com/phxql"]
|
- ["Moritz Kammerer", "https://github.com/phxql"]
|
||||||
|
- ["Jerome Meinke", "https://github.com/jmeinke"]
|
||||||
lang: de-de
|
lang: de-de
|
||||||
filename: latex-de.tex
|
filename: latex-de.tex
|
||||||
---
|
---
|
||||||
```
|
```
|
||||||
% Alle Kommentare starten fangen mit % an
|
% Alle Kommentare starten mit einem Prozentzeichen %
|
||||||
% Es gibt keine Kommentare über mehrere Zeilen
|
|
||||||
|
|
||||||
% LateX ist keine "What You See Is What You Get" Textverarbeitungssoftware wie z.B.
|
% LaTeX ist keine "What You See Is What You Get" Textverarbeitungssoftware wie z.B.
|
||||||
% MS Word oder OpenOffice Writer
|
% MS Word oder OpenOffice Writer
|
||||||
|
|
||||||
% Jedes LateX-Kommando startet mit einem Backslash (\)
|
% Jedes LaTeX-Kommando startet mit einem Backslash (\)
|
||||||
|
|
||||||
% LateX-Dokumente starten immer mit der Definition des Dokuments, die sie darstellen
|
% LaTeX-Dokumente starten immer mit der Definition des Dokuments, die sie darstellen
|
||||||
% Weitere Dokumententypen sind z.B. book, report, presentations, etc.
|
% Weitere Dokumententypen sind z.B. book, report, presentations, etc.
|
||||||
% Optionen des Dokuments stehen zwischen den eckigen Klammern []. In diesem Fall
|
% Optionen des Dokuments stehen zwischen den eckigen Klammern []. In diesem Fall
|
||||||
% wollen wir einen 12 Punkte-Font verwenden.
|
% wollen wir einen 12 Punkte-Font verwenden.
|
||||||
@ -26,7 +26,7 @@ filename: latex-de.tex
|
|||||||
|
|
||||||
% Als nächstes definieren wir die Pakete, die wir verwenden wollen.
|
% Als nächstes definieren wir die Pakete, die wir verwenden wollen.
|
||||||
% Wenn du z.B. Grafiken, farbigen Text oder Quelltext in dein Dokument einbetten möchtest,
|
% Wenn du z.B. Grafiken, farbigen Text oder Quelltext in dein Dokument einbetten möchtest,
|
||||||
% musst du die Fähigkeiten von Latex durch Hinzufügen von Paketen erweitern.
|
% musst du die Fähigkeiten von LaTeX durch Hinzufügen von Paketen erweitern.
|
||||||
% Wir verwenden die Pakete float und caption für Bilder.
|
% Wir verwenden die Pakete float und caption für Bilder.
|
||||||
\usepackage{caption}
|
\usepackage{caption}
|
||||||
\usepackage{float}
|
\usepackage{float}
|
||||||
@ -34,30 +34,41 @@ filename: latex-de.tex
|
|||||||
% Mit diesem Paket können leichter Umlaute getippt werden
|
% Mit diesem Paket können leichter Umlaute getippt werden
|
||||||
\usepackage[utf8]{inputenc}
|
\usepackage[utf8]{inputenc}
|
||||||
|
|
||||||
|
% Es gibt eigentlich keine Kommentare über mehrere Zeilen, solche kann man
|
||||||
|
% aber selbst durch die Angabe eigener Kommandos definieren.
|
||||||
|
% Dieses Kommando kann man später benutzen.
|
||||||
|
\newcommand{\comment}[1]{}
|
||||||
|
|
||||||
% Es können durchaus noch weitere Optione für das Dokument gesetzt werden!
|
% Es können durchaus noch weitere Optione für das Dokument gesetzt werden!
|
||||||
\author{Chaitanya Krishna Ande, Colton Kohnke \& Sricharan Chiruvolu}
|
\author{Chaitanya Krishna Ande, Colton Kohnke \& Sricharan Chiruvolu}
|
||||||
\date{\today}
|
\date{\today}
|
||||||
\title{Learn LaTeX in Y Minutes!}
|
\title{Learn \LaTeX\ in Y Minutes!}
|
||||||
|
|
||||||
% Nun kann's losgehen mit unserem Dokument.
|
% Nun kann's losgehen mit unserem Dokument.
|
||||||
% Alles vor dieser Zeile wird die Preamble genannt.
|
% Alles vor dieser Zeile wird die Preamble genannt.
|
||||||
\begin{document}
|
\begin{document}
|
||||||
|
|
||||||
|
\comment{
|
||||||
|
Dies ist unser selbst-definierter Befehl
|
||||||
|
für mehrzeilige Kommentare.
|
||||||
|
}
|
||||||
|
|
||||||
% Wenn wir den Autor, das Datum und den Titel gesetzt haben, kann
|
% Wenn wir den Autor, das Datum und den Titel gesetzt haben, kann
|
||||||
% LateX für uns eine Titelseite generieren
|
% LaTeX für uns eine Titelseite generieren
|
||||||
\maketitle
|
\maketitle
|
||||||
|
|
||||||
% Die meisten Paper haben ein Abstract. LateX bietet dafür einen vorgefertigen Befehl an.
|
% Die meisten Paper haben ein Abstract. LaTeX bietet dafür einen vorgefertigen Befehl an.
|
||||||
% Das Abstract sollte in der logischen Reihenfolge, also nach dem Titel, aber vor dem
|
% Das Abstract sollte in der logischen Reihenfolge, also nach dem Titel, aber vor dem
|
||||||
% Inhalt erscheinen.
|
% Inhalt erscheinen.
|
||||||
% Dieser Befehl ist in den Dokumentenklassen article und report verfügbar.
|
% Dieser Befehl ist in den Dokumentenklassen article und report verfügbar.
|
||||||
\begin{abstract}
|
\begin{abstract}
|
||||||
LateX documentation geschrieben in LateX! Wie ungewöhnlich und garantiert nicht meine Idee!
|
\LaTeX -Documentation geschrieben in \LaTeX ! Wie ungewöhnlich und garantiert nicht meine Idee!
|
||||||
\end{abstract}
|
\end{abstract}
|
||||||
|
|
||||||
% Section Befehle sind intuitiv.
|
% Section Befehle sind intuitiv.
|
||||||
% Alle Titel der sections werden automatisch in das Inhaltsverzeichnis übernommen.
|
% Alle Titel der sections werden automatisch in das Inhaltsverzeichnis übernommen.
|
||||||
\section{Einleitung}
|
\section{Einleitung}
|
||||||
Hi, mein Name ist Moritz und zusammen werden wir LateX erforschen!
|
Hi, mein Name ist Moritz und zusammen werden wir \LaTeX\ erforschen!
|
||||||
|
|
||||||
\section{Noch eine section}
|
\section{Noch eine section}
|
||||||
Das hier ist der Text für noch eine section. Ich glaube, wir brauchen eine subsection.
|
Das hier ist der Text für noch eine section. Ich glaube, wir brauchen eine subsection.
|
||||||
@ -72,15 +83,15 @@ So ist's schon viel besser.
|
|||||||
% Wenn wir den Stern nach section schreiben, dann unterdrückt LateX die Nummerierung.
|
% Wenn wir den Stern nach section schreiben, dann unterdrückt LateX die Nummerierung.
|
||||||
% Das funktioniert auch bei anderen Befehlen.
|
% Das funktioniert auch bei anderen Befehlen.
|
||||||
\section*{Das ist eine unnummerierte section}
|
\section*{Das ist eine unnummerierte section}
|
||||||
Es müssen nicht alle sections nummeriert sein!
|
Es müssen nicht alle Sections nummeriert sein!
|
||||||
|
|
||||||
\section{Ein paar Notizen}
|
\section{Ein paar Notizen}
|
||||||
LateX ist ziemlich gut darin, Text so zu platzieren, dass es gut aussieht.
|
\LaTeX\ ist ziemlich gut darin, Text so zu platzieren, dass es gut aussieht.
|
||||||
Falls eine Zeile \\ mal \\ woanders \\ umgebrochen \\ werden \\ soll, füge
|
Falls eine Zeile \\ mal \\ woanders \\ umgebrochen \\ werden \\ soll, füge
|
||||||
\textbackslash\textbackslash in den Code ein.\\
|
\textbackslash\textbackslash in den Code ein.\\
|
||||||
|
|
||||||
\section{Listen}
|
\section{Listen}
|
||||||
Listen sind eine der einfachsten Dinge in LateX. Ich muss morgen einkaufen gehen,
|
Listen sind eine der einfachsten Dinge in \LaTeX. Ich muss morgen einkaufen gehen,
|
||||||
also lass uns eine Einkaufsliste schreiben:
|
also lass uns eine Einkaufsliste schreiben:
|
||||||
\begin{enumerate} % Dieser Befehl erstellt eine "enumerate" Umgebung.
|
\begin{enumerate} % Dieser Befehl erstellt eine "enumerate" Umgebung.
|
||||||
% \item bringt enumerate dazu, eins weiterzuzählen.
|
% \item bringt enumerate dazu, eins weiterzuzählen.
|
||||||
@ -96,7 +107,7 @@ also lass uns eine Einkaufsliste schreiben:
|
|||||||
|
|
||||||
\section{Mathe}
|
\section{Mathe}
|
||||||
|
|
||||||
Einer der Haupteinsatzzwecke von LateX ist das Schreiben von akademischen
|
Einer der Haupteinsatzzwecke von \LaTeX\ ist das Schreiben von akademischen
|
||||||
Artikeln oder Papern. Meistens stammen diese aus dem Bereich der Mathe oder
|
Artikeln oder Papern. Meistens stammen diese aus dem Bereich der Mathe oder
|
||||||
anderen Wissenschaften. Und deswegen müssen wir in der Lage sein, spezielle
|
anderen Wissenschaften. Und deswegen müssen wir in der Lage sein, spezielle
|
||||||
Symbole zu unserem Paper hinzuzufügen! \\
|
Symbole zu unserem Paper hinzuzufügen! \\
|
||||||
@ -106,15 +117,15 @@ Symbole für Mengen und relationen, Pfeile, Operatoren und Griechische Buchstabe
|
|||||||
um nur ein paar zu nennen.\\
|
um nur ein paar zu nennen.\\
|
||||||
|
|
||||||
Mengen und Relationen spielen eine sehr wichtige Rolle in vielen mathematischen
|
Mengen und Relationen spielen eine sehr wichtige Rolle in vielen mathematischen
|
||||||
Papern. So schreibt man in LateX, dass alle y zu X gehören: $\forall$ y $\in$ X. \\
|
Papern. So schreibt man in \LaTeX, dass alle y zu X gehören: $\forall$ y $\in$ X. \\
|
||||||
|
|
||||||
% Achte auf die $ Zeichen vor und nach den Symbolen. Wenn wir in LateX schreiben,
|
% Achte auf die $ Zeichen vor und nach den Symbolen. Wenn wir in LaTeX schreiben,
|
||||||
% geschieht dies standardmäßig im Textmodus. Die Mathe-Symbole existieren allerdings
|
% geschieht dies standardmäßig im Textmodus. Die Mathe-Symbole existieren allerdings
|
||||||
% nur im Mathe-Modus. Wir können den Mathe-Modus durch das $ Zeichen aktivieren und
|
% nur im Mathe-Modus. Wir können den Mathe-Modus durch das $ Zeichen aktivieren und
|
||||||
% ihn mit $ wieder verlassen. Variablen können auch im Mathe-Modus angezeigt werden.
|
% ihn mit $ wieder verlassen. Variablen können auch im Mathe-Modus angezeigt werden.
|
||||||
|
|
||||||
Mein Lieblingsbuchstabe im Griechischen ist $\xi$. Ich mag auch $\beta$, $\gamma$ und $\sigma$.
|
Mein Lieblingsbuchstabe im Griechischen ist $\xi$. Ich mag auch $\beta$, $\gamma$ und $\sigma$.
|
||||||
Bis jetzt habe ich noch keinen griechischen Buchstaben gefunden, den LateX nicht kennt!
|
Bis jetzt habe ich noch keinen griechischen Buchstaben gefunden, den \LaTeX nicht kennt!
|
||||||
|
|
||||||
Operatoren sind ebenfalls wichtige Bestandteile von mathematischen Dokumenten:
|
Operatoren sind ebenfalls wichtige Bestandteile von mathematischen Dokumenten:
|
||||||
Trigonometrische Funktionen ($\sin$, $\cos$, $\tan$),
|
Trigonometrische Funktionen ($\sin$, $\cos$, $\tan$),
|
||||||
@ -148,7 +159,7 @@ Grafiken, Gleichungen, Sections, etc.
|
|||||||
|
|
||||||
Summen und Integrale können mit den sum und int Befehlen dargestellt werden:
|
Summen und Integrale können mit den sum und int Befehlen dargestellt werden:
|
||||||
|
|
||||||
% Manche LateX-Compiler beschweren sich, wenn Leerzeilen in Gleichungen auftauchen
|
% Manche LaTeX-Compiler beschweren sich, wenn Leerzeilen in Gleichungen auftauchen
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\sum_{i=0}^{5} f_{i}
|
\sum_{i=0}^{5} f_{i}
|
||||||
\end{equation}
|
\end{equation}
|
||||||
@ -187,9 +198,9 @@ Wir können Tabellen genauso wie Grafiken einfügen.
|
|||||||
|
|
||||||
% \section{Links} % Kommen bald!
|
% \section{Links} % Kommen bald!
|
||||||
|
|
||||||
\section{Verhindern, dass LateX etwas kompiliert (z.B. Quelltext)}
|
\section{Verhindern, dass \LaTeX\ etwas kompiliert (z.B. Quelltext)}
|
||||||
Angenommen, wir wollen Quelltext in unserem LateX-Dokument. LateX soll
|
Angenommen, wir wollen Quelltext in unserem \LaTeX-Dokument. \LaTeX\ soll
|
||||||
in diesem Fall nicht den Quelltext als LateX-Kommandos interpretieren,
|
in diesem Fall nicht den Quelltext als \LaTeX-Kommandos interpretieren,
|
||||||
sondern es einfach ins Dokument schreiben. Um das hinzubekommen, verwenden
|
sondern es einfach ins Dokument schreiben. Um das hinzubekommen, verwenden
|
||||||
wir eine verbatim Umgebung.
|
wir eine verbatim Umgebung.
|
||||||
|
|
||||||
@ -208,7 +219,7 @@ verwandeln kannst. (Ja, dieses Dokument kompiliert wirklich!) \\
|
|||||||
|
|
||||||
Dafür musst du folgende Schritte durchführen:
|
Dafür musst du folgende Schritte durchführen:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Schreibe das Dokument. (den LateX-Quelltext).
|
\item Schreibe das Dokument. (den \LaTeX -Quelltext).
|
||||||
\item Kompiliere den Quelltext in ein PDF.
|
\item Kompiliere den Quelltext in ein PDF.
|
||||||
Das Kompilieren sieht so ähnlich wie das hier aus (Linux): \\
|
Das Kompilieren sieht so ähnlich wie das hier aus (Linux): \\
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -216,7 +227,7 @@ Dafür musst du folgende Schritte durchführen:
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
Manche LateX-Editoren kombinieren Schritt 1 und 2. Du siehst also nur Schritt 1 und Schritt
|
Manche \LaTeX-Editoren kombinieren Schritt 1 und 2. Du siehst also nur Schritt 1 und Schritt
|
||||||
2 wird unsichtbar im Hintergrund ausgeführt.
|
2 wird unsichtbar im Hintergrund ausgeführt.
|
||||||
|
|
||||||
Alle Formatierungsoptionen werden in Schritt 1 in den Quelltext geschrieben. Schritt 2 verwendet
|
Alle Formatierungsoptionen werden in Schritt 1 in den Quelltext geschrieben. Schritt 2 verwendet
|
||||||
|
@ -38,11 +38,10 @@ not False -- True
|
|||||||
1 < 10 -- True
|
1 < 10 -- True
|
||||||
|
|
||||||
-- Strings and characters
|
-- Strings and characters
|
||||||
"This is a string."
|
"This is a string because it uses double quotes."
|
||||||
'a' -- character
|
'a' -- characters in single quotes
|
||||||
'You cant use single quotes for strings.' -- error!
|
|
||||||
|
|
||||||
-- Strings can be appended
|
-- Strings can be appended.
|
||||||
"Hello " ++ "world!" -- "Hello world!"
|
"Hello " ++ "world!" -- "Hello world!"
|
||||||
|
|
||||||
{-- Lists, Tuples, and Records --}
|
{-- Lists, Tuples, and Records --}
|
||||||
@ -53,10 +52,10 @@ not False -- True
|
|||||||
-- The second example can also be written with two dots.
|
-- The second example can also be written with two dots.
|
||||||
[1..5]
|
[1..5]
|
||||||
|
|
||||||
-- Append lists just like strings
|
-- Append lists just like strings.
|
||||||
[1..5] ++ [6..10] == [1..10] -- True
|
[1..5] ++ [6..10] == [1..10] -- True
|
||||||
|
|
||||||
-- To add one item, use "cons"
|
-- To add one item, use "cons".
|
||||||
0 :: [1..5] -- [0, 1, 2, 3, 4, 5]
|
0 :: [1..5] -- [0, 1, 2, 3, 4, 5]
|
||||||
|
|
||||||
-- The head and tail of a list are returned as a Maybe. Instead of checking
|
-- The head and tail of a list are returned as a Maybe. Instead of checking
|
||||||
@ -64,6 +63,7 @@ not False -- True
|
|||||||
List.head [1..5] -- Just 1
|
List.head [1..5] -- Just 1
|
||||||
List.tail [1..5] -- Just [2, 3, 4, 5]
|
List.tail [1..5] -- Just [2, 3, 4, 5]
|
||||||
List.head [] -- Nothing
|
List.head [] -- Nothing
|
||||||
|
-- List.functionName means the function lives in the List module.
|
||||||
|
|
||||||
-- Every element in a tuple can be a different type, but a tuple has a
|
-- Every element in a tuple can be a different type, but a tuple has a
|
||||||
-- fixed length.
|
-- fixed length.
|
||||||
@ -74,23 +74,28 @@ List.head [] -- Nothing
|
|||||||
fst ("elm", 42) -- "elm"
|
fst ("elm", 42) -- "elm"
|
||||||
snd ("elm", 42) -- 42
|
snd ("elm", 42) -- 42
|
||||||
|
|
||||||
-- Records are like tuples but the fields have names.
|
-- The empty tuple, or "unit", is sometimes used as a placeholder.
|
||||||
-- Notice that equals signs, not colons, are used.
|
-- It is the only value of its type, also called "Unit".
|
||||||
{ x = 3, y = 7}
|
()
|
||||||
|
|
||||||
|
-- Records are like tuples but the fields have names. The order of fields
|
||||||
|
-- doesn't matter. Notice that record values use equals signs, not colons.
|
||||||
|
{ x = 3, y = 7 }
|
||||||
|
|
||||||
-- Access a field with a dot and the field name.
|
-- Access a field with a dot and the field name.
|
||||||
{ x = 3, y = 7}.x -- 3
|
{ x = 3, y = 7 }.x -- 3
|
||||||
|
|
||||||
-- Or with an accessor fuction, a dot and then the field name.
|
-- Or with an accessor fuction, which is a dot and the field name on its own.
|
||||||
.y { x = 3, y = 7} -- 7
|
.y { x = 3, y = 7 } -- 7
|
||||||
|
|
||||||
-- Update the fields of a record. (It must have the fields already.)
|
-- Update the fields of a record. (It must have the fields already.)
|
||||||
{ person |
|
{ person |
|
||||||
name = "George" }
|
name = "George" }
|
||||||
|
|
||||||
{ physics |
|
-- Update multiple fields at once, using the current values.
|
||||||
position = physics.position + physics.velocity,
|
{ particle |
|
||||||
velocity = physics.velocity + physics.acceleration }
|
position = particle.position + particle.velocity,
|
||||||
|
velocity = particle.velocity + particle.acceleration }
|
||||||
|
|
||||||
{-- Control Flow --}
|
{-- Control Flow --}
|
||||||
|
|
||||||
@ -111,11 +116,16 @@ else
|
|||||||
-- Use case statements to pattern match on different possibilities.
|
-- Use case statements to pattern match on different possibilities.
|
||||||
case aList of
|
case aList of
|
||||||
[] -> "matches the empty list"
|
[] -> "matches the empty list"
|
||||||
|
[x]-> "matches a list of exactly one item, " ++ toString x
|
||||||
x::xs -> "matches a list of at least one item whose head is " ++ toString x
|
x::xs -> "matches a list of at least one item whose head is " ++ toString x
|
||||||
|
-- Pattern matches go in order. If we put [x] last, it would never match because
|
||||||
|
-- x::xs also matches (xs would be the empty list). Matches do not "fall through".
|
||||||
|
-- The compiler will alert you to missing or extra cases.
|
||||||
|
|
||||||
|
-- Pattern match on a Maybe.
|
||||||
case List.head aList of
|
case List.head aList of
|
||||||
Just x -> "The head is " ++ toString x
|
Just x -> "The head is " ++ toString x
|
||||||
Nothing -> "The list was empty"
|
Nothing -> "The list was empty."
|
||||||
|
|
||||||
{-- Functions --}
|
{-- Functions --}
|
||||||
|
|
||||||
@ -126,7 +136,7 @@ case List.head aList of
|
|||||||
multiply a b =
|
multiply a b =
|
||||||
a * b
|
a * b
|
||||||
|
|
||||||
-- Apply (call) a function by passing it arguments (no commas necessay).
|
-- Apply (call) a function by passing it arguments (no commas necessary).
|
||||||
multiply 7 6 -- 42
|
multiply 7 6 -- 42
|
||||||
|
|
||||||
-- Partially apply a function by passing only some of its arguments.
|
-- Partially apply a function by passing only some of its arguments.
|
||||||
@ -151,8 +161,8 @@ area (width, height) =
|
|||||||
|
|
||||||
area (6, 7) -- 42
|
area (6, 7) -- 42
|
||||||
|
|
||||||
-- Use curly brackets to pattern match record field names
|
-- Use curly brackets to pattern match record field names.
|
||||||
-- Use let to define intermediate values
|
-- Use let to define intermediate values.
|
||||||
volume {width, height, depth} =
|
volume {width, height, depth} =
|
||||||
let
|
let
|
||||||
area = width * height
|
area = width * height
|
||||||
@ -161,21 +171,22 @@ volume {width, height, depth} =
|
|||||||
|
|
||||||
volume { width = 3, height = 2, depth = 7 } -- 42
|
volume { width = 3, height = 2, depth = 7 } -- 42
|
||||||
|
|
||||||
-- Functions can be recursive
|
-- Functions can be recursive.
|
||||||
fib n =
|
fib n =
|
||||||
if n < 2 then
|
if n < 2 then
|
||||||
1
|
1
|
||||||
else
|
else
|
||||||
fib (n - 1) + fib (n - 2)
|
fib (n - 1) + fib (n - 2)
|
||||||
|
|
||||||
List.map fib [0..8] -- [1, 1, 2, 3, 5, 8,13, 21, 34]
|
List.map fib [0..8] -- [1, 1, 2, 3, 5, 8, 13, 21, 34]
|
||||||
|
|
||||||
|
-- Another recursive function (use List.length in real code).
|
||||||
listLength aList =
|
listLength aList =
|
||||||
case aList of
|
case aList of
|
||||||
[] -> 0
|
[] -> 0
|
||||||
x::xs -> 1 + listLength xs
|
x::xs -> 1 + listLength xs
|
||||||
|
|
||||||
-- Function application happens before any infix operation
|
-- Function calls happen before any infix operator. Parens indicate precedence.
|
||||||
cos (degrees 30) ^ 2 + sin (degrees 30) ^ 2 -- 1
|
cos (degrees 30) ^ 2 + sin (degrees 30) ^ 2 -- 1
|
||||||
-- First degrees is applied to 30, then the result is passed to the trig
|
-- First degrees is applied to 30, then the result is passed to the trig
|
||||||
-- functions, which is then squared, and the addition happens last.
|
-- functions, which is then squared, and the addition happens last.
|
||||||
@ -191,7 +202,7 @@ cos (degrees 30) ^ 2 + sin (degrees 30) ^ 2 -- 1
|
|||||||
True : Bool
|
True : Bool
|
||||||
|
|
||||||
-- Functions have types too. Read -> as "goes to". Think of the rightmost type
|
-- Functions have types too. Read -> as "goes to". Think of the rightmost type
|
||||||
-- as the type of the return value.
|
-- as the type of the return value, and the others as arguments.
|
||||||
not : Bool -> Bool
|
not : Bool -> Bool
|
||||||
round : Float -> Int
|
round : Float -> Int
|
||||||
|
|
||||||
@ -220,34 +231,41 @@ origin =
|
|||||||
{ x = 0, y = 0, z = 0 }
|
{ x = 0, y = 0, z = 0 }
|
||||||
|
|
||||||
-- You can give existing types a nice name with a type alias.
|
-- You can give existing types a nice name with a type alias.
|
||||||
type alias Point3D = { x : Float, y : Float, z : Float }
|
type alias Point3D =
|
||||||
|
{ x : Float, y : Float, z : Float }
|
||||||
|
|
||||||
-- If you alias a record, you can use the name as a constructor function.
|
-- If you alias a record, you can use the name as a constructor function.
|
||||||
otherOrigin : Point3D
|
otherOrigin : Point3D
|
||||||
otherOrigin = Point3D 0 0 0
|
otherOrigin =
|
||||||
|
Point3D 0 0 0
|
||||||
|
|
||||||
-- But it's still the same type, you can equate them
|
-- But it's still the same type, so you can equate them.
|
||||||
origin == otherOrigin -- True
|
origin == otherOrigin -- True
|
||||||
|
|
||||||
-- By contrast, defining a union type creates a type that didn't exist before.
|
-- By contrast, defining a union type creates a type that didn't exist before.
|
||||||
-- A union type is so called because it can be one of many possibilities.
|
-- A union type is so called because it can be one of many possibilities.
|
||||||
-- Each of the possibilities is represented as a "tag".
|
-- Each of the possibilities is represented as a "tag".
|
||||||
type Direction = North | South | East | West
|
type Direction =
|
||||||
|
North | South | East | West
|
||||||
|
|
||||||
-- Tags can carry other values of known type. This can work recursively.
|
-- Tags can carry other values of known type. This can work recursively.
|
||||||
type IntTree = Leaf | Node Int IntTree IntTree
|
type IntTree =
|
||||||
|
Leaf | Node Int IntTree IntTree
|
||||||
-- "Leaf" and "Node" are the tags. Everything following a tag is a type.
|
-- "Leaf" and "Node" are the tags. Everything following a tag is a type.
|
||||||
|
|
||||||
-- Tags can be used as values or functions.
|
-- Tags can be used as values or functions.
|
||||||
root : IntTree
|
root : IntTree
|
||||||
root = Node 7 Leaf Leaf
|
root =
|
||||||
|
Node 7 Leaf Leaf
|
||||||
|
|
||||||
-- Union types (and type aliases) can use type variables.
|
-- Union types (and type aliases) can use type variables.
|
||||||
type Tree a = Leaf | Node a (Tree a) (Tree a)
|
type Tree a =
|
||||||
|
Leaf | Node a (Tree a) (Tree a)
|
||||||
|
-- "The type tree-of-a is a leaf, or a node of a, tree-of-a, and tree-of-a."
|
||||||
|
|
||||||
-- You can pattern match union tags. The uppercase tags must be matched exactly.
|
-- Pattern match union tags. The uppercase tags will be matched exactly. The
|
||||||
-- The lowercase variables will match anything. Underscore also matches
|
-- lowercase variables will match anything. Underscore also matches anything,
|
||||||
-- anything, but signifies that you aren't using it.
|
-- but signifies that you aren't using it.
|
||||||
leftmostElement : Tree a -> Maybe a
|
leftmostElement : Tree a -> Maybe a
|
||||||
leftmostElement tree =
|
leftmostElement tree =
|
||||||
case tree of
|
case tree of
|
||||||
@ -260,21 +278,20 @@ leftmostElement tree =
|
|||||||
|
|
||||||
{-- Modules and Imports --}
|
{-- Modules and Imports --}
|
||||||
|
|
||||||
-- The core libraries are organized into modulues, as are any third-party
|
-- The core libraries are organized into modules, as are any third-party
|
||||||
-- libraries you may use. For large projects, you can define your own modulues.
|
-- libraries you may use. For large projects, you can define your own modules.
|
||||||
|
|
||||||
-- Put this at the top of the file. If omitted, you're in Main.
|
-- Put this at the top of the file. If omitted, you're in Main.
|
||||||
module Name where
|
module Name where
|
||||||
|
|
||||||
-- By default, everything is exported.
|
-- By default, everything is exported. You can specify exports explicity.
|
||||||
-- Limit what values and types are exported
|
module Name (MyType, myValue) where
|
||||||
module Name (Type, value) where
|
|
||||||
|
|
||||||
-- One common pattern is to export a union type but not its tags. This is known
|
-- One common pattern is to export a union type but not its tags. This is known
|
||||||
-- as an "opaque type", and is frequently used in libraries.
|
-- as an "opaque type", and is frequently used in libraries.
|
||||||
|
|
||||||
-- Import code from other modules to use it in this one
|
-- Import code from other modules to use it in this one.
|
||||||
-- Places Dict in scope, so you can call Dict.insert
|
-- Places Dict in scope, so you can call Dict.insert.
|
||||||
import Dict
|
import Dict
|
||||||
|
|
||||||
-- Imports the Dict module and the Dict type, so your annotations don't have to
|
-- Imports the Dict module and the Dict type, so your annotations don't have to
|
||||||
@ -318,6 +335,8 @@ $ elm repl
|
|||||||
-- Install a new package, and record it in elm-package.json.
|
-- Install a new package, and record it in elm-package.json.
|
||||||
$ elm package install evancz/elm-html
|
$ elm package install evancz/elm-html
|
||||||
|
|
||||||
|
-- See what changed between versions of a package.
|
||||||
|
$ elm package diff evancz/elm-html 3.0.0 4.0.2
|
||||||
-- Elm's package manager enforces semantic versioning, so minor version bumps
|
-- Elm's package manager enforces semantic versioning, so minor version bumps
|
||||||
-- will never break your build!
|
-- will never break your build!
|
||||||
```
|
```
|
||||||
@ -335,12 +354,14 @@ Here are some useful resources.
|
|||||||
|
|
||||||
* Documentation for [Elm's core libraries](http://package.elm-lang.org/packages/elm-lang/core/latest/). Take note of:
|
* Documentation for [Elm's core libraries](http://package.elm-lang.org/packages/elm-lang/core/latest/). Take note of:
|
||||||
* [Basics](http://package.elm-lang.org/packages/elm-lang/core/latest/Basics), which is imported by default
|
* [Basics](http://package.elm-lang.org/packages/elm-lang/core/latest/Basics), which is imported by default
|
||||||
* Data structures like [Array](http://package.elm-lang.org/packages/elm-lang/core/latest/Array), [Dict](http://package.elm-lang.org/packages/elm-lang/core/latest/Dict), and [Set](http://package.elm-lang.org/packages/elm-lang/core/latest/Set)
|
* [Maybe](http://package.elm-lang.org/packages/elm-lang/core/latest/Maybe) and its cousin [Result](http://package.elm-lang.org/packages/elm-lang/core/latest/Result), commonly used for missing values or error handling
|
||||||
|
* Data structures like [List](http://package.elm-lang.org/packages/elm-lang/core/latest/List), [Array](http://package.elm-lang.org/packages/elm-lang/core/latest/Array), [Dict](http://package.elm-lang.org/packages/elm-lang/core/latest/Dict), and [Set](http://package.elm-lang.org/packages/elm-lang/core/latest/Set)
|
||||||
* JSON [encoding](http://package.elm-lang.org/packages/elm-lang/core/latest/Json-Encode) and [decoding](http://package.elm-lang.org/packages/elm-lang/core/latest/Json-Decode)
|
* JSON [encoding](http://package.elm-lang.org/packages/elm-lang/core/latest/Json-Encode) and [decoding](http://package.elm-lang.org/packages/elm-lang/core/latest/Json-Decode)
|
||||||
|
|
||||||
* [The Elm Architecture](https://github.com/evancz/elm-architecture-tutorial#the-elm-architecture). An essay with examples on how to organize code into components.
|
* [The Elm Architecture](https://github.com/evancz/elm-architecture-tutorial#the-elm-architecture). An essay by Elm's creator with examples on how to organize code into components.
|
||||||
|
|
||||||
* The [Elm mailing list](https://groups.google.com/forum/#!forum/elm-discuss). Everyone is friendly and helpful.
|
* The [Elm mailing list](https://groups.google.com/forum/#!forum/elm-discuss). Everyone is friendly and helpful.
|
||||||
|
|
||||||
|
* [Scope in Elm](https://github.com/elm-guides/elm-for-js/blob/master/Scope.md#scope-in-elm) and [How to Read a Type Annotation](https://github.com/elm-guides/elm-for-js/blob/master/How%20to%20Read%20a%20Type%20Annotation.md#how-to-read-a-type-annotation). More community guides on the basics of Elm, written for JavaScript developers.
|
||||||
|
|
||||||
Go out and write some Elm!
|
Go out and write some Elm!
|
||||||
|
213
es-es/latex-es.html.markdown
Normal file
213
es-es/latex-es.html.markdown
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
---
|
||||||
|
language: latex
|
||||||
|
lang: es-es
|
||||||
|
contributors:
|
||||||
|
- ["Chaitanya Krishna Ande", "http://icymist.github.io"]
|
||||||
|
- ["Colton Kohnke", "http://github.com/voltnor"]
|
||||||
|
- ["Sricharan Chiruvolu", "http://sricharan.xyz"]
|
||||||
|
translators:
|
||||||
|
- ["Mario Pérez", "https://github.com/MarioPerezEsteso"]
|
||||||
|
filename: learn-latex-es.tex
|
||||||
|
---
|
||||||
|
|
||||||
|
```tex
|
||||||
|
% Todas las líneas comentadas comienzan con %
|
||||||
|
% No existen los comentarios multilínea
|
||||||
|
|
||||||
|
% LaTeX NO es un software de procesamiento de texto que cumple con
|
||||||
|
% "Lo que ves es lo que tienes" como MS Word u OpenOffice
|
||||||
|
|
||||||
|
% Todos los comandos de LaTeX comienzan con una contrabarra (\)
|
||||||
|
|
||||||
|
% Los documentos LaTeX comienzan definiendo el tipo de documento que se va a
|
||||||
|
% compilar. Algunos tipos de documentos son libros, informes, presentaciones,
|
||||||
|
% etc. Las opciones para el documento comienzan en los corchetes []. En este
|
||||||
|
% caso, se especifica que queremos utilizar una fuente de tamaño 12pt.
|
||||||
|
\documentclass[12pt]{article}
|
||||||
|
|
||||||
|
% A continuación, definimos los paquetes que utilizará el documento.
|
||||||
|
% Si quieres incluir gráficos, texto coloreado o código fuente de otro lenguaje,
|
||||||
|
% debes extender las funciones de LaTeX. Esto se consigue añadiendo paquetes.
|
||||||
|
% A continuación se incluirán los paquetes float y caption para figuras.
|
||||||
|
\usepackage{caption}
|
||||||
|
\usepackage{float}
|
||||||
|
|
||||||
|
% También podemos definir otras propiedades en el documento
|
||||||
|
\author{Chaitanya Krishna Ande, Colton Kohnke \& Sricharan Chiruvolu}
|
||||||
|
\date{\today}
|
||||||
|
\title{Learn LaTeX in Y Minutes!}
|
||||||
|
|
||||||
|
% Ahora estamos preparados para comenzar el documento
|
||||||
|
% Todo lo que se encuentre antes de esta línea se llama "El Preámbulo"
|
||||||
|
\begin{document}
|
||||||
|
% Si especificamos el autor, fecha y título, LaTeX creará una página como título
|
||||||
|
% por nosotros
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
% La mayoría de los artículos de investigación tienen un abstract. Es posible
|
||||||
|
% utilizar comandos predefinidos para ello.
|
||||||
|
% Esto debería aparecer en su orden lógico. Tras el título pero antes de las
|
||||||
|
% secciones principales del cuerpo.
|
||||||
|
% Este comando está disponible en los tipos de documentos article y report.
|
||||||
|
\begin{abstract}
|
||||||
|
Documentación de LaTex escrita en LaTex.
|
||||||
|
\end{abstract}
|
||||||
|
|
||||||
|
% Los comandos de sección son intuitivos.
|
||||||
|
% Todos los títulos de secciones son añadidos automáticamente a la tabla de contenidos.
|
||||||
|
\section{Introducción}
|
||||||
|
Hola, mi nombre es Mario Pérez y estoy traduciendo este documento para aprender LaTex.
|
||||||
|
|
||||||
|
\section{Otra sección}
|
||||||
|
Este es el texto de otra sección. Creo que necesitará una subsección.
|
||||||
|
|
||||||
|
\subsection{Esto es una subsección} % Las subsecciones también son fáciles.
|
||||||
|
Creo que necesitamos otra más.
|
||||||
|
|
||||||
|
\subsubsection{Pitágoras}
|
||||||
|
Mejor ahora.
|
||||||
|
\label{subsec:pitagoras}
|
||||||
|
|
||||||
|
% Utilizando el asterisco podemos decirle a LaTeX que no ponga los números de secciones y subsecciones.
|
||||||
|
% Esto también funciona con otros comandos de LaTeX.
|
||||||
|
\section*{Esto es una sección no numerada}
|
||||||
|
¡No todas las secciones tienen que estar numeradas!
|
||||||
|
|
||||||
|
\section{Algunas notas}
|
||||||
|
LaTeX es generalmente bastante bueno situando el texto donde debe ir. Si una lína \\ necesita \\ ser \\ rota \\ puedes poner \textbackslash\textbackslash en el código fuente. \\
|
||||||
|
|
||||||
|
\section{Listas}
|
||||||
|
Las listas son de las cosas más fáciles de crear en LaTeX. Necesito ir a comprar mañana, así que vamos a crear una lista de la compra.
|
||||||
|
\begin{enumerate} % Esto crea una lista numerada.
|
||||||
|
% \item crea un elemento
|
||||||
|
\item Ensalada.
|
||||||
|
\item 27 sandías.
|
||||||
|
\item Pescado.
|
||||||
|
% podemos incluso sobreescribir el número del ítem usando []
|
||||||
|
\item[cuántos?] Plátanos.
|
||||||
|
|
||||||
|
No es un ítem de la lista, pero sigue siendo parte de la enumeración.
|
||||||
|
|
||||||
|
\end{enumerate} % Todos los contextos deben tener un final.
|
||||||
|
|
||||||
|
\section{Matemáticas}
|
||||||
|
|
||||||
|
Uno de los usos principales de LaTeX es la producción de artículos académicos o técnicos. Normalmente relacionados con la ciencia y las matemáticas. Debido a esto, necesitamos poder añadir símbolos especiales a nuestro artículo.\\
|
||||||
|
|
||||||
|
En matemáticas hay muchos símbolos. Más de los que podemos encontrar en un teclado. Flechas o letras por nombrar un par.\\
|
||||||
|
|
||||||
|
Algunos símbolos juegan un papel fundamental en muchos artículos de investigación matemática. Así es como se establece que todo Y pertenece a X: $\forall$ x $\in$ X. \\
|
||||||
|
He necesitado añadir el signo $ antes de los símbolos. Esto se debe a que cuando escribimos, estamos en modo texto. Sin embargo, los símbolos solo pueden utilizarse en modo matemático, al cual se entra con el signo $.
|
||||||
|
% Lo opuesto también se cumple. Una variable también puede ser mostrada en modo matemático, al que también se puede entrar con \[\]
|
||||||
|
|
||||||
|
\[a^2 + b^2 = c^2 \]
|
||||||
|
|
||||||
|
Mi letra griega favorita es $\xi$. También me gustan $\beta$, $\gamma$ y $\sigma$.
|
||||||
|
Todavía no he encontrado una letra griega que LaTeX no conozca.
|
||||||
|
|
||||||
|
Los operadores son también una parte esencial de un documento matemático:
|
||||||
|
funciones trigonométricas ($\sin$, $\cos$, $\tan$), logaritmos y exponenciales ($\log$, $\exp$), límites ($\lim$), etc. tienen comandos predefinidos en LaTeX.
|
||||||
|
|
||||||
|
Vamos a escribir una ecuación para ver cómo se hace: \\
|
||||||
|
|
||||||
|
$\cos(2\theta) = \cos^{2}(\theta) - \sin^{2}(\theta)$
|
||||||
|
|
||||||
|
Las fracciones (numeradores-denominadores) pueden escribirse de la siguiente forma:
|
||||||
|
|
||||||
|
% 10 / 7
|
||||||
|
$^{10}/_{7}$
|
||||||
|
|
||||||
|
% Las fracciones relativamente complejas pueden escribirse como
|
||||||
|
% \frac{numerador}{denominador}
|
||||||
|
$\frac{n!}{k!(n - k)!}$ \\
|
||||||
|
|
||||||
|
También podemos insertar ecuaciones en un contexto de ecuación.
|
||||||
|
|
||||||
|
% Mostrar matemáticas en el contexto de ecuaciones
|
||||||
|
\begin{equation} % entra en modo matemático
|
||||||
|
c^2 = a^2 + b^2.
|
||||||
|
\label{eq:pitagoras} % para referencias
|
||||||
|
\end{equation} % Todos los contextos deben tener un final.
|
||||||
|
|
||||||
|
Podemos referenciar nuestra nueva ecuación.
|
||||||
|
Ecuación ~\ref{eq:pythagoras} también se conoce como el Teorema de Pitágoras, el cual también se encuentra en la sección ~\ref{subsec:pythagoras}. Muchas cosas pueden ser etiquetadas: figures, equations, sections, etc.
|
||||||
|
|
||||||
|
Los sumatorios e integrales son escritor son los comandos sum e int:
|
||||||
|
|
||||||
|
% Algunos compiladores de LaTeX se quejarán si hay líneas en blanco
|
||||||
|
% En un contexto de ecuación.
|
||||||
|
\begin{equation}
|
||||||
|
\sum_{i=0}^{5} f_{i}
|
||||||
|
\end{equation}
|
||||||
|
\begin{equation}
|
||||||
|
\int_{0}^{\infty} \mathrm{e}^{-x} \mathrm{d}x
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
\section{Figuras}
|
||||||
|
|
||||||
|
Vamos a insertar una figura. Situarla puede ser algo complicado.
|
||||||
|
|
||||||
|
\begin{figure}[H] % H aquí establece la situación de la figura.
|
||||||
|
\centering % centra la figura en la página
|
||||||
|
% Inserta una figura escalada por 0.8 el ancho de la página.
|
||||||
|
%\includegraphics[width=0.8\linewidth]{right-triangle.png}
|
||||||
|
% La línea anterior ha sido comentada para poder compilar este archivo. Por favor, usa tu imaginación.
|
||||||
|
\caption{Triángulo con lados $a$, $b$, $c$}
|
||||||
|
\label{fig:right-triangle}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Tablas}
|
||||||
|
También podemos insertar tablas de la misma manera que las figuras.
|
||||||
|
|
||||||
|
\begin{table}[H]
|
||||||
|
\caption{Título para la tabla.}
|
||||||
|
% los argumentos en {} describen cómo cada fila va a ser representada.
|
||||||
|
\begin{tabular}{c|cc}
|
||||||
|
Número & Nombre & Apellido \\
|
||||||
|
\hline % una línea horizontal
|
||||||
|
1 & Biggus & Dickus \\
|
||||||
|
2 & Monty & Python
|
||||||
|
\end{tabular}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
% \section{Hyperlinks} % En construcción
|
||||||
|
|
||||||
|
\section{Haciendo que LaTeX no compile algo (por ejemplo, código fuente)}
|
||||||
|
Digamos que queremos incluir código fuente dentro de nuestro documento LaTex. En ese caso, debemos indicarle a LaTeX que no trate de compilarlo y simplemente lo muestre en el documento. Esto lo realizamos en el contexto verbatim.
|
||||||
|
|
||||||
|
% Hay otros paquetes para esta misma tarea, pero verbatim es el más básico.
|
||||||
|
\begin{verbatim}
|
||||||
|
print("Hola Mundo!")
|
||||||
|
a%b; % Podemos usar los signos % en verbatim.
|
||||||
|
aleatorio = 4; # Número aleatorio
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\section{Compilación}
|
||||||
|
|
||||||
|
Ahora mismo te estarás preguntando cómo compilar este fabuloso documento y obtener un documento PDF.\\
|
||||||
|
Para obtener el documento final utilizando LaTeX hay que seguir los siguientes pasos:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Escribe el documento en texto plano.
|
||||||
|
\item Compila el código para producir un PDF.
|
||||||
|
Los pasos de compilación serán algo parecido a esto (en Linux): \\
|
||||||
|
\begin{verbatim}
|
||||||
|
$pdflatex learn-latex.tex learn-latex.pdf
|
||||||
|
\end{verbatim}
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
Un gran número de editores LaTeX combinan ambos pasos para que sea más sencillo obtener el documento.
|
||||||
|
|
||||||
|
Escribe toda la información de formato en el paso 1 y con el paso 2 obtendrás el documento que has definido en el paso anterior.
|
||||||
|
|
||||||
|
\section{End}
|
||||||
|
|
||||||
|
Esto es todo por ahora.
|
||||||
|
|
||||||
|
% fin del documento
|
||||||
|
\end{document}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Más información sobre LaTeX
|
||||||
|
|
||||||
|
* El wikilibro LaTeX: [https://es.wikibooks.org/wiki/Manual_de_LaTeX](https://es.wikibooks.org/wiki/Manual_de_LaTeX)
|
||||||
|
* Un tutorial real: [http://www.latex-tutorial.com/](http://www.latex-tutorial.com/)
|
825
es-es/php-es.html.markdown
Normal file
825
es-es/php-es.html.markdown
Normal file
@ -0,0 +1,825 @@
|
|||||||
|
---
|
||||||
|
language: PHP
|
||||||
|
contributors:
|
||||||
|
- ["Malcolm Fell", "http://emarref.net/"]
|
||||||
|
- ["Trismegiste", "https://github.com/Trismegiste"]
|
||||||
|
translators:
|
||||||
|
- ["Mario Pérez", "https://github.com/MarioPerezEsteso"]
|
||||||
|
lang: es-es
|
||||||
|
filename: learnphp-es.php
|
||||||
|
---
|
||||||
|
|
||||||
|
Este documento explica el funcionamiento de PHP 5+.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php // El código PHP debe estar dentro de etiquetas <?php
|
||||||
|
|
||||||
|
// Si tu fichero php solo contiene código php, es una buena práctica
|
||||||
|
// omitir la etiqueta de cierre php para prevenir salidas acidentales.
|
||||||
|
|
||||||
|
// Dos barras comienzan un comentario de una línea.
|
||||||
|
|
||||||
|
# También lo hará una almohadilla, pero // es más común
|
||||||
|
|
||||||
|
/*
|
||||||
|
Escribir texto entre una barra-asterisco y asterisco-barra
|
||||||
|
crea un comentario multilínea.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Utiliza "echo" o "print" para imprimir por pantalla
|
||||||
|
print('Hola '); // Imprime "Hola " sin salto de línea
|
||||||
|
|
||||||
|
// () son opcionales para print y echo
|
||||||
|
echo "Mundo\n"; // Imprime "Mundo" con un salto de línea
|
||||||
|
// (todas las sentencias deben finalizar con un punto y coma)
|
||||||
|
|
||||||
|
// Cualquier cosa fuera de las etiquetas <?php se imprime automáticamente
|
||||||
|
?>
|
||||||
|
¡Hola Mundo de nuevo!
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/************************************
|
||||||
|
* Tipos y variables
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Las variables comienzan con el símbolo $.
|
||||||
|
// Una variable válida comienza con una letra o guión bajo,
|
||||||
|
// seguida de cualquier cantidad de letras, números o guiones bajos.
|
||||||
|
|
||||||
|
// Las variables booleanas no distinguen entre mayúsculas o minúsculas
|
||||||
|
$boolean = true; // o TRUE o True
|
||||||
|
$boolean = false; // o FALSE o False
|
||||||
|
|
||||||
|
// Enteros
|
||||||
|
$int1 = 12; // => 12
|
||||||
|
$int2 = -12; // => -12
|
||||||
|
$int3 = 012; // => 10 (un 0 al comienzo declara un número octal)
|
||||||
|
$int4 = 0x0F; // => 15 (un 0x al comienzo declara un hexadecimal)
|
||||||
|
|
||||||
|
// Floats (también conocidos como doubles)
|
||||||
|
$float = 1.234;
|
||||||
|
$float = 1.2e3;
|
||||||
|
$float = 7E-10;
|
||||||
|
|
||||||
|
// Eliminar variable
|
||||||
|
unset($int1);
|
||||||
|
|
||||||
|
// Operaciones aritméticas
|
||||||
|
$suma = 1 + 1; // 2
|
||||||
|
$diferencia = 2 - 1; // 1
|
||||||
|
$producto = 2 * 2; // 4
|
||||||
|
$cociente = 2 / 1; // 2
|
||||||
|
|
||||||
|
// Operaciones aritméticas de escritura rápida
|
||||||
|
$numero = 0;
|
||||||
|
$numero += 1; // Incrementa $numero en 1
|
||||||
|
echo $numero++; // Imprime 1 (incremento después la evaluación)
|
||||||
|
echo ++$numero; // Imprime 3 (incremento antes de la evaluación)
|
||||||
|
$numero /= $float; // Divide y asigna el cociente a $numero
|
||||||
|
|
||||||
|
// Las cadenas de caracteres deben declararse entre comillas simples
|
||||||
|
$sgl_quotes = '$String'; // => '$String'
|
||||||
|
|
||||||
|
// Evita utilizar comillas dobles excepto para embeber otras variables
|
||||||
|
$dbl_quotes = "This is a $sgl_quotes."; // => 'This is a $String.'
|
||||||
|
|
||||||
|
// Los caracteres especiales solo son válidos entre comillas dobles
|
||||||
|
$escaped = "Esto contiene \t un caracter tabulador.";
|
||||||
|
$unescaped = 'Esto solo contiene una barra y una t: \t';
|
||||||
|
|
||||||
|
// Rodea una variable entre corchetes si es necesario
|
||||||
|
$dinero = "Tengo $${numero} en el banco.";
|
||||||
|
|
||||||
|
// Desde PHP 5.3, los nowdocs pueden ser utilizados para multilíneas no interpoladas
|
||||||
|
$nowdoc = <<<'END'
|
||||||
|
Multi line
|
||||||
|
string
|
||||||
|
END;
|
||||||
|
|
||||||
|
// Heredocs interpola cadenas de caracteres
|
||||||
|
$heredoc = <<<END
|
||||||
|
Multi line
|
||||||
|
$sgl_quotes
|
||||||
|
END;
|
||||||
|
|
||||||
|
// La concatenación de cadenas de caracteres se realiza con .
|
||||||
|
echo 'Esta cadena de caracteres ' . 'está concatenada';
|
||||||
|
|
||||||
|
// Las cadenas de caracteres pueden ser pasadas como parámetros en un echo
|
||||||
|
echo 'Multiples', 'Parametros', 'Validos'; // Devuelve 'MultiplesParametrosValidos'
|
||||||
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Constantes
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Una constante se define utilizando define()
|
||||||
|
// y nunca puede ser cambiada en tiempo de ejecución
|
||||||
|
|
||||||
|
// un nombre válido para una constante debe comenzar con una letra o guión bajo,
|
||||||
|
// seguido por cualquier número de letras, números o guiones bajos.
|
||||||
|
define("FOO", "algo");
|
||||||
|
|
||||||
|
// el acceso a una constante se puede realizar llamando a la variable elegida sin un símbolo de $
|
||||||
|
echo FOO; // Devuelve 'algo'
|
||||||
|
echo 'Esto imprime '.FOO; // Devuelve 'Esto imprime algo'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Arrays
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Todos los arrays en PHP son asociativos (hashmaps),
|
||||||
|
|
||||||
|
// Los arrays asociativos son conocidos como hashmaps en algunos lenguajes.
|
||||||
|
|
||||||
|
// Funciona con todas las versiones de php
|
||||||
|
$asociativo = array('Uno' => 1, 'Dos' => 2, 'Tres' => 3);
|
||||||
|
|
||||||
|
// PHP 5.4 introdujo una nueva sintaxis
|
||||||
|
$asociativo = ['Uno' => 1, 'Dos' => 2, 'Tres' => 3];
|
||||||
|
|
||||||
|
echo $asociativo['Uno']; // imprime 1
|
||||||
|
|
||||||
|
// Lista literales implícitamente asignados con claves enteras
|
||||||
|
$array = ['Uno', 'Dos', 'Tres'];
|
||||||
|
echo $array[0]; // => "Uno"
|
||||||
|
|
||||||
|
// Añadir un elemento al final de un array
|
||||||
|
$array[] = 'Cuatro';
|
||||||
|
// o
|
||||||
|
array_push($array, 'Cinco');
|
||||||
|
|
||||||
|
// Eliminar un elemento de un array
|
||||||
|
unset($array[3]);
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Salidas por pantalla
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo('¡Hola Mundo!');
|
||||||
|
// Imprime ¡Hola Mundo! en stdout.
|
||||||
|
// Stdout es la página web si se está ejecutando en un navegador.
|
||||||
|
|
||||||
|
print('!Hola Mundo!'); // Es lo mismo que echo
|
||||||
|
|
||||||
|
// No es necesario el paréntesis en echo y print
|
||||||
|
echo '¡Hola Mundo!';
|
||||||
|
print '¡Hola Mundo!';
|
||||||
|
|
||||||
|
$parrafo = 'parrafo';
|
||||||
|
|
||||||
|
echo 100; // Haz echo de escalares directamente
|
||||||
|
echo $parrafo; // o de variables
|
||||||
|
|
||||||
|
// Si las etiquetas cortas estás configuradas y tu versión de PHP es
|
||||||
|
// la 5.4.0 o superior, puede utilizar la sintaxis abreviada de echo
|
||||||
|
?>
|
||||||
|
<p><?= $parrafo?></p>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$x = 1;
|
||||||
|
$y = 2;
|
||||||
|
$x = $y; // $x ahora contiene el mismo valor que $y
|
||||||
|
$z = &$y;
|
||||||
|
// $z contiene ahora una referencia a $y. Un cambio en el valor de
|
||||||
|
// $z cambiará también el valor de $y, y viceversa.
|
||||||
|
// $x sin embargo, tendrá el valor original de $y
|
||||||
|
|
||||||
|
echo $x; // => 2
|
||||||
|
echo $z; // => 2
|
||||||
|
$y = 0;
|
||||||
|
echo $x; // => 2
|
||||||
|
echo $z; // => 0
|
||||||
|
|
||||||
|
// Dump muestra el tipo y valor de una variable en stdout
|
||||||
|
var_dump($z); // imprime int(0)
|
||||||
|
|
||||||
|
// Para mostrar el valor de una variable en un formato legible para humanos
|
||||||
|
print_r($array); // imprime: Array ( [0] => Uno [1] => Dos [2] => Tres )
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Lógica
|
||||||
|
*/
|
||||||
|
$a = 0;
|
||||||
|
$b = '0';
|
||||||
|
$c = '1';
|
||||||
|
$d = '1';
|
||||||
|
|
||||||
|
// assert lanza una advertencia si su argumento no es verdadero
|
||||||
|
|
||||||
|
// Estas comparaciones siempre serán verdaderas, incluso si los tipos no son los mismos.
|
||||||
|
assert($a == $b); // igualdad
|
||||||
|
assert($c != $a); // desigualdad
|
||||||
|
assert($c <> $a); // desigualdad alternativa
|
||||||
|
assert($a < $c);
|
||||||
|
assert($c > $b);
|
||||||
|
assert($a <= $b);
|
||||||
|
assert($c >= $d);
|
||||||
|
|
||||||
|
// Los siguiente solo será verdadero si los valores coinciden y son del mismo tipo.
|
||||||
|
assert($c === $d);
|
||||||
|
assert($a !== $d);
|
||||||
|
assert(1 === '1');
|
||||||
|
assert(1 !== '1');
|
||||||
|
|
||||||
|
// Operador 'Spaceship' (desde PHP 7)
|
||||||
|
// Devuelve 0 si ambos valores son iguales
|
||||||
|
// Devuelve 1 si el valor de la izquierda es mayor
|
||||||
|
// Devuelve -1 si el valor de la derecha es mayor
|
||||||
|
|
||||||
|
$a = 100;
|
||||||
|
$b = 1000;
|
||||||
|
|
||||||
|
echo $a <=> $a; // 0 porque son iguales
|
||||||
|
echo $a <=> $b; // -1 porque $a < $b
|
||||||
|
echo $b <=> $a; // 1 porque $b > $a
|
||||||
|
|
||||||
|
// Las variables pueden ser convertidas entre tipos, dependiendo de su uso.
|
||||||
|
|
||||||
|
$entero = 1;
|
||||||
|
echo $entero + $entero; // => 2
|
||||||
|
|
||||||
|
$string = '1';
|
||||||
|
echo $string + $string; // => 2 (los strings son convertidos a enteros)
|
||||||
|
|
||||||
|
$string = 'uno';
|
||||||
|
echo $string + $string; // => 0
|
||||||
|
// Muestra un 0 porque el operador + no puede convertir la cadena de caracteres 'uno' a un número
|
||||||
|
|
||||||
|
// La conversión de tipos puede ser utilizada para tratar a una variable como otro tipo
|
||||||
|
|
||||||
|
$boolean = (boolean) 1; // => true
|
||||||
|
|
||||||
|
$cero = 0;
|
||||||
|
$boolean = (boolean) $cero; // => false
|
||||||
|
|
||||||
|
// También hay funciones dedicadas a la conversión de tipos
|
||||||
|
$entero = 5;
|
||||||
|
$string = strval($entero);
|
||||||
|
|
||||||
|
$var = null; // Valor nulo
|
||||||
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Estructuras de control
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (true) {
|
||||||
|
print 'He sido imprimido';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false) {
|
||||||
|
print 'Yo no';
|
||||||
|
} else {
|
||||||
|
print 'He sido imprimido';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false) {
|
||||||
|
print 'No se imprime';
|
||||||
|
} elseif(true) {
|
||||||
|
print 'Sí se imprime';
|
||||||
|
}
|
||||||
|
|
||||||
|
// operador ternario
|
||||||
|
print (false ? 'No se imprime' : 'Sí se imprime');
|
||||||
|
|
||||||
|
// atajo para el operador ternario desde PHP 5.3
|
||||||
|
// equivalente de "$x ? $x : 'Sí'""
|
||||||
|
$x = false;
|
||||||
|
print($x ?: 'Sí');
|
||||||
|
|
||||||
|
// operador 'no definido' desde php 7
|
||||||
|
$a = null;
|
||||||
|
$b = 'Imprime';
|
||||||
|
echo $a ?? 'a no está definido'; // imprime 'a no está definido'
|
||||||
|
echo $b ?? 'b no está definido'; // imprime 'Imprime'
|
||||||
|
|
||||||
|
|
||||||
|
$x = 0;
|
||||||
|
if ($x === '0') {
|
||||||
|
print 'No imprime';
|
||||||
|
} elseif($x == '1') {
|
||||||
|
print 'No imprime';
|
||||||
|
} else {
|
||||||
|
print 'Imprime';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Esta sintaxis alternativa se utiliza para plantillas:
|
||||||
|
?>
|
||||||
|
|
||||||
|
<?php if ($x): ?>
|
||||||
|
Esto se muestra si la evaluación es verdadera.
|
||||||
|
<?php else: ?>
|
||||||
|
En otro caso, se muestra esto.
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Utiliza el switch para tener algo más de lógica.
|
||||||
|
switch ($x) {
|
||||||
|
case '0':
|
||||||
|
print 'Switch does type coercion';
|
||||||
|
break; // Debes incluir un break para no seguir con los casos 'Dos' y 'Tres'
|
||||||
|
case 'Dos':
|
||||||
|
case 'Tres':
|
||||||
|
// Hacer algo si la variables es 'Dos' o 'Tres'
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Hacer algo por defecto
|
||||||
|
}
|
||||||
|
|
||||||
|
// Los bucles While, do...while y for te serán familiares
|
||||||
|
$i = 0;
|
||||||
|
while ($i < 5) {
|
||||||
|
echo $i++;
|
||||||
|
}; // Imprime "01234"
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
do {
|
||||||
|
echo $i++;
|
||||||
|
} while ($i < 5); // Imprime "01234"
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
|
for ($x = 0; $x < 10; $x++) {
|
||||||
|
echo $x;
|
||||||
|
} // Imprime "0123456789"
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
|
$ruedas = ['bicicleta' => 2, 'coche' => 4];
|
||||||
|
|
||||||
|
// Los bucles foreach pueden iterar por arrays
|
||||||
|
foreach ($ruedas as $numero_ruedas) {
|
||||||
|
echo $numero_ruedas;
|
||||||
|
} // Imprime "24"
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
|
// También se puede iterar sobre las claves, así como sobre los valores
|
||||||
|
foreach ($ruedas as $vehiculo => $numero_ruedas) {
|
||||||
|
echo "Un $vehiculo tiene $numero_ruedas ruedas";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
while ($i < 5) {
|
||||||
|
if ($i === 3) {
|
||||||
|
break; // Sale fuera del bucle while
|
||||||
|
}
|
||||||
|
echo $i++;
|
||||||
|
} // Imprime "012"
|
||||||
|
|
||||||
|
for ($i = 0; $i < 5; $i++) {
|
||||||
|
if ($i === 3) {
|
||||||
|
continue; // Se salta esta iteración del bucle
|
||||||
|
}
|
||||||
|
echo $i;
|
||||||
|
} // Imprime "0124"
|
||||||
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Funciones
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Define una función con "function":
|
||||||
|
function mi_funcion () {
|
||||||
|
return 'Hola';
|
||||||
|
}
|
||||||
|
|
||||||
|
echo mi_funcion(); // => "Hola"
|
||||||
|
|
||||||
|
// Un nombre válido de función comienza con una letra o guión bajo, seguido de cualquier
|
||||||
|
// número de letras, números o guiones bajos.
|
||||||
|
|
||||||
|
function anadir ($x, $y = 1) { // $y es opcional y por defecto es 1
|
||||||
|
$resultado = $x + $y;
|
||||||
|
return $resultado;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo anadir(4); // => 5
|
||||||
|
echo anadir(4, 2); // => 6
|
||||||
|
|
||||||
|
// $resultado no es accesible fuera de la función
|
||||||
|
// print $resultado; // Devuelve una advertencia.
|
||||||
|
|
||||||
|
// Desde PHP 5.3 se pueden declarar funciones anónimas
|
||||||
|
$inc = function ($x) {
|
||||||
|
return $x + 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
echo $inc(2); // => 3
|
||||||
|
|
||||||
|
function foo ($x, $y, $z) {
|
||||||
|
echo "$x - $y - $z";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Las funciones pueden devolver funciones
|
||||||
|
function bar ($x, $y) {
|
||||||
|
// Utiliza 'use' para meter variables de fuera de la función
|
||||||
|
return function ($z) use ($x, $y) {
|
||||||
|
foo($x, $y, $z);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
$bar = bar('A', 'B');
|
||||||
|
$bar('C'); // Imprime "A - B - C"
|
||||||
|
|
||||||
|
// Puedes llamar a funciones utilizando cadenas de caracteres
|
||||||
|
$nombre_funcion = 'add';
|
||||||
|
echo $nombre_funcion(1, 2); // => 3
|
||||||
|
// Es útil para determinarl qué función ejecutar.
|
||||||
|
// O, utiliza call_user_func(callable $callback [, $parameter [, ... ]]);
|
||||||
|
|
||||||
|
|
||||||
|
// Puedes obtener todos los parámetros pasados a una función
|
||||||
|
function parametros() {
|
||||||
|
$numero_argumentos = func_num_args();
|
||||||
|
if ($numero_argumentos > 0) {
|
||||||
|
echo func_get_arg(0) . ' | ';
|
||||||
|
}
|
||||||
|
$args_array = func_get_args();
|
||||||
|
foreach ($args_array as $key => $arg) {
|
||||||
|
echo $key . ' - ' . $arg . ' | ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parametros('Hola', 'Mundo'); // Hola | 0 - Hola | 1 - Mundo |
|
||||||
|
|
||||||
|
// Desde PHP 5.6 se puede obtener un número variable de argumentos
|
||||||
|
function variable($palabra, ...$lista) {
|
||||||
|
echo $palabra . " || ";
|
||||||
|
foreach ($lista as $item) {
|
||||||
|
echo $item . ' | ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable("Separa", "Hola", "Mundo") // Separa || Hola | Mundo |
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Includes
|
||||||
|
*/
|
||||||
|
|
||||||
|
<?php
|
||||||
|
// Los ficheros PHP incluidos deben comenzar también con la etiqueta de <?php
|
||||||
|
|
||||||
|
include 'mi-fichero.php';
|
||||||
|
// El código de mi-fichero.php ya está disponible en el entorno actual.
|
||||||
|
// Si el fichero no puede ser incluido (por ejemplo porque no se ha encontrado),
|
||||||
|
// se muestra una advertencia.
|
||||||
|
|
||||||
|
include_once 'mi-fichero.php';
|
||||||
|
// Si el código del fichero mi-fichero.php ya ha sido incluido, ya no se
|
||||||
|
// incluirá de nuevo. Este previene errores por múltiples declaraciones.
|
||||||
|
|
||||||
|
require 'mi-fichero.php';
|
||||||
|
require_once 'mi-fichero.php';
|
||||||
|
// Es lo mismo que el include(), pero require() causará un error fatal si el archivo
|
||||||
|
// no ha podido ser incluido.
|
||||||
|
|
||||||
|
// Contenido de mi-include.php:
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return 'Cualquier cosa.';
|
||||||
|
// acabar archivo
|
||||||
|
|
||||||
|
// Los include y require también pueden devolver un valor.
|
||||||
|
$valor = include 'mi-include.php';
|
||||||
|
|
||||||
|
// Los archivos son incluidos en función de la ruta data o, si ninguna ruta es
|
||||||
|
// especificada se utilizará la directiva de configuración de include_path. Si el
|
||||||
|
// fichero no se encuentra en el include_path, include comprobará la ruta del código
|
||||||
|
// que lo llama antes de fallar.
|
||||||
|
/* */
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Clases
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Las clases son definidas con la palabra clave class
|
||||||
|
|
||||||
|
class MiClase
|
||||||
|
{
|
||||||
|
const MI_CONSTANTE = 'valor'; // Una constante
|
||||||
|
|
||||||
|
static $staticVar = 'static';
|
||||||
|
|
||||||
|
// Las variables estáticas y su visibilidad
|
||||||
|
public static $publicStaticVar = 'publicStatic';
|
||||||
|
// Accesible solo dentro de su clase
|
||||||
|
private static $privateStaticVar = 'privateStatic';
|
||||||
|
// Accesible desde la clase y las subclases
|
||||||
|
protected static $protectedStaticVar = 'protectedStatic';
|
||||||
|
|
||||||
|
// Las propiedades deben declarar su visibilidad
|
||||||
|
public $propiedad = 'public';
|
||||||
|
public $instanceProp;
|
||||||
|
protected $prot = 'protected'; // Accesible desde la clase y las subclases
|
||||||
|
private $priv = 'private'; // Accesible solo desde la clase
|
||||||
|
|
||||||
|
// Crear un constructor con __construct
|
||||||
|
public function __construct($instanceProp) {
|
||||||
|
// Accede a las variables de la instancia con $this
|
||||||
|
$this->instanceProp = $instanceProp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Los métodos son declarados como funciones dentro de una clase
|
||||||
|
public function miMetodo()
|
||||||
|
{
|
||||||
|
print 'MiClase';
|
||||||
|
}
|
||||||
|
|
||||||
|
// la palabra clave final hará una función no sobreescribible
|
||||||
|
final function noMePuedesSobreEscribir()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Declarar propiedades de clase o métodos como estáticos los hace accesibles sin
|
||||||
|
* necesidad de instanciar la clase. Una propiedad declarada como estática no
|
||||||
|
* puede ser accedida mediante una instancia de la clase, pero sí mediante un
|
||||||
|
* método estático.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static function miMetodoEstatico()
|
||||||
|
{
|
||||||
|
print 'Soy estático';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Las constantes de una clase siempre pueden ser accedidas estáticamente
|
||||||
|
echo MiClase::MI_CONSTANTE; // Muestra 'valor';
|
||||||
|
|
||||||
|
echo MiClase::$staticVar; // Muestra 'static';
|
||||||
|
MiClase::miMetodoEstatico(); // Muestra 'Soy estático';
|
||||||
|
|
||||||
|
// Instancia una clase usando new
|
||||||
|
$mi_clase = new MiClase('Una instancia');
|
||||||
|
// Los paréntesis son opcionales si no se pasa ningún argumento.
|
||||||
|
|
||||||
|
// Accede a los miembros de una clase utilizando ->
|
||||||
|
echo $mi_clase->propiedad; // => "public"
|
||||||
|
echo $mi_clase->instanceProp; // => "Una instancia"
|
||||||
|
$mi_clase->miMetodo(); // => "MiClase"
|
||||||
|
|
||||||
|
|
||||||
|
// Extender clases utilizando "extends"
|
||||||
|
class MiOtraClase extends MiClase
|
||||||
|
{
|
||||||
|
function imprimePropiedadProtegida()
|
||||||
|
{
|
||||||
|
echo $this->prot;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sobreescribe un método
|
||||||
|
function miMetodo()
|
||||||
|
{
|
||||||
|
parent::miMetodo();
|
||||||
|
print ' > MiOtraClase';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$mi_otra_clase = new MiOtraClase('Propiedad de instancia');
|
||||||
|
$mi_otra_clase->imprimePropiedadProtegida(); // => Imprime "protected"
|
||||||
|
$mi_otra_clase->miMetodo(); // Imprime "MiClase > MiOtraClase"
|
||||||
|
|
||||||
|
final class NoMePuedesExtender
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Puedes utilizar "métodos mágicos" para crear los getters y setters
|
||||||
|
class MiClaseMapeada
|
||||||
|
{
|
||||||
|
private $propiedad;
|
||||||
|
|
||||||
|
public function __get($key)
|
||||||
|
{
|
||||||
|
return $this->$key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __set($key, $value)
|
||||||
|
{
|
||||||
|
$this->$key = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$x = new MiClaseMapeada();
|
||||||
|
echo $x->propiedad; // Utilizará el método __get()
|
||||||
|
$x->propiedad = 'Algo'; // Utilizará el método __set()
|
||||||
|
|
||||||
|
// Las clases pueden ser abstractas (utilizando la palabra clave abstract) o
|
||||||
|
// implementando interfaces (utilizando la palabra clave implements).
|
||||||
|
// Una interfaz puede ser declarada con la palabra clave interface.
|
||||||
|
|
||||||
|
interface InterfazUno
|
||||||
|
{
|
||||||
|
public function hazAlgo();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface InterfazDos
|
||||||
|
{
|
||||||
|
public function hazOtraCosa();
|
||||||
|
}
|
||||||
|
|
||||||
|
// las interfaces pueden ser extendidas
|
||||||
|
interface InterfazTres extends InterfazDos
|
||||||
|
{
|
||||||
|
public function hazCualquierOtraCosa();
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class MiClaseAbstracta implements InterfazUno
|
||||||
|
{
|
||||||
|
public $x = 'hazAlgo';
|
||||||
|
}
|
||||||
|
|
||||||
|
class MiOtraClase extends MiClaseAbstracta implements InterfazDos
|
||||||
|
{
|
||||||
|
public function hazAlgo()
|
||||||
|
{
|
||||||
|
echo $x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hazOtraCosa()
|
||||||
|
{
|
||||||
|
echo 'hazOtraCosa';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Las clases pueden implementar más de una interfaz
|
||||||
|
class CualquierOtraClase implements InterfazUno, InterfazDos
|
||||||
|
{
|
||||||
|
public function hazAlgo()
|
||||||
|
{
|
||||||
|
echo 'hazAlgo';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hazOtraCosa()
|
||||||
|
{
|
||||||
|
echo 'hazOtraCosa';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Traits
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Los traits están disponibles desde PHP 5.4.0 y son declarados utilizando "trait"
|
||||||
|
|
||||||
|
trait MiTrait
|
||||||
|
{
|
||||||
|
public function miMetodoTrait()
|
||||||
|
{
|
||||||
|
print 'Tengo trait';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MiClaseTrait
|
||||||
|
{
|
||||||
|
use MiTrait;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cls = new MiClaseTrait();
|
||||||
|
$cls->miMetodoTrait(); // Imprime "Tengo trait"
|
||||||
|
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Namespaces
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Esta sección está separada porque una declaración de namespace debe
|
||||||
|
// ser la primera sentencia en un archivo. Vamos a suponer que no es el caso
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Por defecto, las clases existen en el namespace global y pueden ser llamadas
|
||||||
|
// explícitamente con una contrabarra.
|
||||||
|
|
||||||
|
$cls = new \MiClase();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Estableder el namespace para un archivo
|
||||||
|
namespace Mi\Namespace;
|
||||||
|
|
||||||
|
class MiClase
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// (de otro archivo)
|
||||||
|
$cls = new Mi\Namespace\MiClase;
|
||||||
|
|
||||||
|
// O de otro namespace.
|
||||||
|
namespace Mi\Otro\Namespace;
|
||||||
|
|
||||||
|
use Mi\Namespace\MiClase;
|
||||||
|
|
||||||
|
$cls = new MiClase();
|
||||||
|
|
||||||
|
// O se puede asignar un ales al namespace
|
||||||
|
|
||||||
|
namespace Mi\Otro\Namespace;
|
||||||
|
|
||||||
|
use Mi\Namespace as OtroNamespace;
|
||||||
|
|
||||||
|
$cls = new OtroNamespace\MiClase();
|
||||||
|
|
||||||
|
|
||||||
|
/**********************
|
||||||
|
* Late Static Binding
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ClasePadre {
|
||||||
|
public static function quien() {
|
||||||
|
echo "Soy una " . __CLASS__ . "\n";
|
||||||
|
}
|
||||||
|
public static function test() {
|
||||||
|
// Auto referencia a la clase en la que el método está definido
|
||||||
|
self::quien();
|
||||||
|
// Referencia estáticamente a la clase donde el método ha sido llamado
|
||||||
|
static::quien();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ClasePadre::test();
|
||||||
|
/*
|
||||||
|
Soy una ClasePadre
|
||||||
|
Soy una ClasePadre
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ClaseHija extends ClasePadre {
|
||||||
|
public static function quien() {
|
||||||
|
echo "Pero soy una " . __CLASS__ . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ClaseHija::test();
|
||||||
|
/*
|
||||||
|
Soy una ClasePadre
|
||||||
|
Pero soy una ClaseHija
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**********************
|
||||||
|
* Manejo de errores
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Una simple gestión de errores puede ser realizada con un bloque try catch
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Haz algo
|
||||||
|
} catch (Exception $e) {
|
||||||
|
// Maneja la excepción
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cuando se utilicen bloques try catch en un entorno con namespaces hay que
|
||||||
|
// usar lo siguiente
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Haz algo
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// Maneja la excepción
|
||||||
|
}
|
||||||
|
|
||||||
|
// Excepciones personalizadas
|
||||||
|
|
||||||
|
class MiExcepcion extends Exception {}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
$condicion = true;
|
||||||
|
|
||||||
|
if ($condicion) {
|
||||||
|
throw new MiExcepcion('Ha pasado algo');
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (MiExcepcion $e) {
|
||||||
|
// Manejar la excepción
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Más información
|
||||||
|
|
||||||
|
Visita la [documentación oficial de PHP](http://www.php.net/manual/) para más referencias
|
||||||
|
y apoyo de la comunidad.
|
||||||
|
|
||||||
|
Si estás interesado en buenas prácticas, visita
|
||||||
|
[PHP The Right Way](http://www.phptherightway.com/).
|
||||||
|
|
||||||
|
Si vienes de un lenguaje con una buena gestión de paquetes, visita
|
||||||
|
[Composer](http://getcomposer.org/).
|
||||||
|
|
||||||
|
Para estándares comunes, visita el PHP Framework Interoperability Group
|
||||||
|
[PSR standards](https://github.com/php-fig/fig-standards).
|
@ -3,7 +3,7 @@ name: Go
|
|||||||
category: language
|
category: language
|
||||||
language: Go
|
language: Go
|
||||||
lang: fr-fr
|
lang: fr-fr
|
||||||
filename: learngo.go
|
filename: learngo-fr.go
|
||||||
contributors:
|
contributors:
|
||||||
- ["Sonia Keys", "https://github.com/soniakeys"]
|
- ["Sonia Keys", "https://github.com/soniakeys"]
|
||||||
- ["Christopher Bess", "https://github.com/cbess"]
|
- ["Christopher Bess", "https://github.com/cbess"]
|
||||||
|
@ -13,8 +13,8 @@ Groovy - A dynamic language for the Java platform [Read more here.](http://www.g
|
|||||||
/*
|
/*
|
||||||
Set yourself up:
|
Set yourself up:
|
||||||
|
|
||||||
1) Install GVM - http://gvmtool.net/
|
1) Install SDKMAN - http://sdkman.io/
|
||||||
2) Install Groovy: gvm install groovy
|
2) Install Groovy: sdk install groovy
|
||||||
3) Start the groovy console by typing: groovyConsole
|
3) Start the groovy console by typing: groovyConsole
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
147
hu-hu/yaml-hu.html.markdown
Normal file
147
hu-hu/yaml-hu.html.markdown
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
---
|
||||||
|
language: yaml
|
||||||
|
filename: learnyaml-hu.yaml
|
||||||
|
contributors:
|
||||||
|
- ["Adam Brenecki", "https://github.com/adambrenecki"]
|
||||||
|
translators:
|
||||||
|
- ["Tamás Diószegi", "https://github.com/ditam"]
|
||||||
|
lang: hu-hu
|
||||||
|
---
|
||||||
|
|
||||||
|
A YAML egy adat sorosító nyelv, amit úgy terveztek, hogy közvetlenül is
|
||||||
|
olvasható és írható legyen emberi szemmel.
|
||||||
|
|
||||||
|
A JSON formátum egy szigorú befoglaló halmazát alkotja, kiegészítve azt
|
||||||
|
szintaktikai jelentéssel bíró sortörésekkel és indentációval,
|
||||||
|
a Pythonhoz hasonlóan. A Pythonnal ellentétben azonban a YAML nem engedélyezi
|
||||||
|
a közvetlen tab karakterek jelenlétét.
|
||||||
|
|
||||||
|
Megjegyzés: UTF-8 ékezetes betűk használhatóak, ha a fájl kódlása megfelelő,
|
||||||
|
a kódolást a tartalomban explicit nem kell (és nem is lehet) feltüntetni.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# A kommentek YAML-ban így néznek ki.
|
||||||
|
|
||||||
|
##################
|
||||||
|
# Skalár típusok #
|
||||||
|
##################
|
||||||
|
|
||||||
|
# A gyökér objektumunk (az egész dokumentumra értve) egy map,
|
||||||
|
# ami a más nyelvekből ismert dictionary, hash vagy object típusokkal egyenértékű.
|
||||||
|
kulcs: érték
|
||||||
|
masik_kulcs: Másik érték jön ide.
|
||||||
|
egy_szam: 100
|
||||||
|
tudomanyos_jelolessel: 1e+12
|
||||||
|
boolean: true
|
||||||
|
null_value: null
|
||||||
|
kulcs benne szóközökkel: érték
|
||||||
|
# Látható, hogy a sztringeket nem szükséges idézőjelek közé zárni, bár szabad.
|
||||||
|
Továbbá: "Idézőjelekkel megadott sztring."
|
||||||
|
"A kulcs is lehet idézőjeles.": "Hasznos lehet, ha ':'-ot akarsz a kulcsban."
|
||||||
|
|
||||||
|
# Többsoros sztringek írhatóak 'literal block'-ként ('|' jelet használva)
|
||||||
|
# vagy 'folded block'-ként is ('>' jelet használva).
|
||||||
|
literal_block: |
|
||||||
|
Ez az egész szöveg-blokk lesz az értéke a literal_block kulcsnak,
|
||||||
|
a sortöréseket megtartva.
|
||||||
|
|
||||||
|
Az ilyen sztringet az indentáció visszahúzása zárja le, a behúzás pedig
|
||||||
|
eltávolításra kerül.
|
||||||
|
|
||||||
|
A 'még jobban' behúzott részek megtartják a behúzásukat -
|
||||||
|
ezeknek a soroknak 4 szóköz behúzása lesz.
|
||||||
|
folded_style: >
|
||||||
|
Az az egész szöveg-blokk lesz az értéke a 'folded_style' kulcsnak, de
|
||||||
|
ezúttal minden sortörés egy szóközre lesz cserélve.
|
||||||
|
|
||||||
|
Az üres sorok, mint a fenti, új sor karakterre cserélődnek.
|
||||||
|
|
||||||
|
A 'még jobban' behúzott sorok megtartják a sortöréseiket, -
|
||||||
|
ez a szöveg két sorban jelenik meg.
|
||||||
|
|
||||||
|
######################
|
||||||
|
# Gyűjtemény típusok #
|
||||||
|
######################
|
||||||
|
|
||||||
|
# Egymásba ágyazás a behúzás változtatásával érhető el.
|
||||||
|
beagyazott_map:
|
||||||
|
key: value
|
||||||
|
another_key: Another Value
|
||||||
|
masik_beagyazott_map:
|
||||||
|
hello: hello
|
||||||
|
|
||||||
|
# A mapeknek nem csak sztring kulcsaik lehetnek.
|
||||||
|
0.25: lebegőpontos kulcs
|
||||||
|
|
||||||
|
# A kulcsok lehetnek többsoros objektumok is, ? jellel jelezve a kulcs kezdetét
|
||||||
|
? |
|
||||||
|
Ez itt egy
|
||||||
|
többsoros kulcs
|
||||||
|
: és ez az értéke
|
||||||
|
|
||||||
|
# Szintén engedélyezett a kollekció típusok használata kulcsként, de egyéb
|
||||||
|
# nyelvekben ez gyakran problémákat fog okozni.
|
||||||
|
|
||||||
|
# Szekvenciák (listákkal vagy tömbökkel egyenértékűek) így néznek ki:
|
||||||
|
egy_szekvencia:
|
||||||
|
- Item 1
|
||||||
|
- Item 2
|
||||||
|
- 0.5 # Többféle típust is tartalmazhat
|
||||||
|
- Item 4
|
||||||
|
- key: value
|
||||||
|
another_key: another_value
|
||||||
|
-
|
||||||
|
- Ez egy szekvencia
|
||||||
|
- egy másik szekvenciába ágyazva
|
||||||
|
|
||||||
|
# Mivel a YAML a JSON befoglaló halmazát alkotja, JSON szintaxisú
|
||||||
|
# mapek és szekvenciák is használhatóak:
|
||||||
|
json_map: {"key": "value"}
|
||||||
|
json_seq: [3, 2, 1, "takeoff"]
|
||||||
|
|
||||||
|
#########################
|
||||||
|
# EXTRA YAML KÉPESSÉGEK #
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# A YAML-ben ún. 'anchor'-ök segítségével könnyen lehet duplikálni
|
||||||
|
# tartalmakat a dokumentumon belül. A következő kulcsok azonos értékkel bírnak:
|
||||||
|
anchored_tartalom: &anchor_neve Ez a sztring két kulcs értéke is lesz.
|
||||||
|
másik_anchor: *anchor_neve
|
||||||
|
|
||||||
|
# Vannak a YAML-ben tagek is, amivel explicit lehet típusokat jelölni.
|
||||||
|
explicit_string: !!str 0.5
|
||||||
|
# Bizonyos implementációk nyelv-specifikus tageket tartalmaznak, mint
|
||||||
|
# például ez a Python komplex szám típusának jelölésére:
|
||||||
|
python_complex_number: !!python/complex 1+2j
|
||||||
|
|
||||||
|
######################
|
||||||
|
# EXTRA YAML TÍPUSOK #
|
||||||
|
######################
|
||||||
|
|
||||||
|
# Nem a sztringek és a számok az egyedüli skalár típusok YAML-ben.
|
||||||
|
# ISO-formátumú dátumok és dátumot jelölő literal kifejezések is értelmezettek.
|
||||||
|
datetime: 2001-12-15T02:59:43.1Z
|
||||||
|
datetime_with_spaces: 2001-12-14 21:59:43.10 -5
|
||||||
|
date: 2002-12-14
|
||||||
|
|
||||||
|
# A !!binary tag jelöli, hogy egy sztring valójában base64-kódolású
|
||||||
|
# reprezentációja egy bináris blob-nak
|
||||||
|
gif_file: !!binary |
|
||||||
|
R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
|
||||||
|
OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
|
||||||
|
+f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
|
||||||
|
AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
|
||||||
|
|
||||||
|
# Létezik a YAML-ban egy halmaz típus (set) is, ami így néz ki:
|
||||||
|
set:
|
||||||
|
? elem1
|
||||||
|
? elem2
|
||||||
|
? elem3
|
||||||
|
|
||||||
|
# Mint Pythonban, a halmazok null értékekkel feltöltött mapek, vagyis a fenti
|
||||||
|
# halmaz egyenértékű a következővel:
|
||||||
|
set2:
|
||||||
|
elem1: null
|
||||||
|
elem2: null
|
||||||
|
elem3: null
|
||||||
|
```
|
647
it-it/python-it.html.markdown
Normal file
647
it-it/python-it.html.markdown
Normal file
@ -0,0 +1,647 @@
|
|||||||
|
---
|
||||||
|
language: python
|
||||||
|
contributors:
|
||||||
|
- ["Louie Dinh", "http://ldinh.ca"]
|
||||||
|
- ["Amin Bandali", "http://aminbandali.com"]
|
||||||
|
- ["Andre Polykanine", "https://github.com/Oire"]
|
||||||
|
filename: learnpython.py
|
||||||
|
translators:
|
||||||
|
- ["Ale46", "http://github.com/Ale46/"]
|
||||||
|
lang: it-it
|
||||||
|
---
|
||||||
|
Python è stato creato da Guido Van Rossum agli inizi degli anni 90. Oggi è uno dei più popolari
|
||||||
|
linguaggi esistenti. Mi sono innamorato di Python per la sua chiarezza sintattica. E' sostanzialmente
|
||||||
|
pseudocodice eseguibile.
|
||||||
|
|
||||||
|
Feedback sono altamente apprezzati! Potete contattarmi su [@louiedinh](http://twitter.com/louiedinh) oppure [at] [google's email service]
|
||||||
|
|
||||||
|
Nota: Questo articolo è valido solamente per Python 2.7, ma dovrebbe andar bene anche per
|
||||||
|
Python 2.x. Per Python 3.x, dai un'occhiata a [Python 3 tutorial](http://learnxinyminutes.com/docs/python3/).
|
||||||
|
|
||||||
|
```python
|
||||||
|
|
||||||
|
# I commenti su una sola linea iniziano con un cancelletto
|
||||||
|
|
||||||
|
""" Più stringhe possono essere scritte
|
||||||
|
usando tre ", e sono spesso usate
|
||||||
|
come commenti
|
||||||
|
"""
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 1. Tipi di dati primitivi ed Operatori
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# Hai i numeri
|
||||||
|
3 # => 3
|
||||||
|
|
||||||
|
# La matematica è quello che vi aspettereste
|
||||||
|
1 + 1 # => 2
|
||||||
|
8 - 1 # => 7
|
||||||
|
10 * 2 # => 20
|
||||||
|
35 / 5 # => 7
|
||||||
|
|
||||||
|
# La divisione è un po' complicata. E' una divisione fra interi in cui viene
|
||||||
|
# restituito in automatico il risultato intero.
|
||||||
|
5 / 2 # => 2
|
||||||
|
|
||||||
|
# Per le divisioni con la virgola abbiamo bisogno di parlare delle variabili floats.
|
||||||
|
2.0 # Questo è un float
|
||||||
|
11.0 / 4.0 # => 2.75 ahhh...molto meglio
|
||||||
|
|
||||||
|
# Il risultato di una divisione fra interi troncati positivi e negativi
|
||||||
|
5 // 3 # => 1
|
||||||
|
5.0 // 3.0 # => 1.0 # funziona anche per i floats
|
||||||
|
-5 // 3 # => -2
|
||||||
|
-5.0 // 3.0 # => -2.0
|
||||||
|
|
||||||
|
# Operazione Modulo
|
||||||
|
7 % 3 # => 1
|
||||||
|
|
||||||
|
# Elevamento a potenza (x alla y-esima potenza)
|
||||||
|
2**4 # => 16
|
||||||
|
|
||||||
|
# Forzare le precedenze con le parentesi
|
||||||
|
(1 + 3) * 2 # => 8
|
||||||
|
|
||||||
|
# Operatori Booleani
|
||||||
|
# Nota "and" e "or" sono case-sensitive
|
||||||
|
True and False #=> False
|
||||||
|
False or True #=> True
|
||||||
|
|
||||||
|
# Note sull'uso di operatori Bool con interi
|
||||||
|
0 and 2 #=> 0
|
||||||
|
-5 or 0 #=> -5
|
||||||
|
0 == False #=> True
|
||||||
|
2 == True #=> False
|
||||||
|
1 == True #=> True
|
||||||
|
|
||||||
|
# nega con not
|
||||||
|
not True # => False
|
||||||
|
not False # => True
|
||||||
|
|
||||||
|
# Uguaglianza è ==
|
||||||
|
1 == 1 # => True
|
||||||
|
2 == 1 # => False
|
||||||
|
|
||||||
|
# Disuguaglianza è !=
|
||||||
|
1 != 1 # => False
|
||||||
|
2 != 1 # => True
|
||||||
|
|
||||||
|
# Altri confronti
|
||||||
|
1 < 10 # => True
|
||||||
|
1 > 10 # => False
|
||||||
|
2 <= 2 # => True
|
||||||
|
2 >= 2 # => True
|
||||||
|
|
||||||
|
# I confronti possono essere concatenati!
|
||||||
|
1 < 2 < 3 # => True
|
||||||
|
2 < 3 < 2 # => False
|
||||||
|
|
||||||
|
# Le stringhe sono create con " o '
|
||||||
|
"Questa è una stringa."
|
||||||
|
'Anche questa è una stringa.'
|
||||||
|
|
||||||
|
# Anche le stringhe possono essere sommate!
|
||||||
|
"Ciao " + "mondo!" # => Ciao mondo!"
|
||||||
|
# Le stringhe possono essere sommate anche senza '+'
|
||||||
|
"Ciao " "mondo!" # => Ciao mondo!"
|
||||||
|
|
||||||
|
# ... oppure moltiplicate
|
||||||
|
"Hello" * 3 # => "HelloHelloHello"
|
||||||
|
|
||||||
|
# Una stringa può essere considerata come una lista di caratteri
|
||||||
|
"Questa è una stringa"[0] # => 'Q'
|
||||||
|
|
||||||
|
# % può essere usato per formattare le stringhe, in questo modo:
|
||||||
|
"%s possono essere %s" % ("le stringhe", "interpolate")
|
||||||
|
|
||||||
|
# Un nuovo modo per fomattare le stringhe è il metodo format.
|
||||||
|
# Questo metodo è quello consigliato
|
||||||
|
"{0} possono essere {1}".format("le stringhe", "formattate")
|
||||||
|
# Puoi usare delle parole chiave se non vuoi contare
|
||||||
|
"{nome} vuole mangiare {cibo}".format(nome="Bob", cibo="lasagna")
|
||||||
|
|
||||||
|
# None è un oggetto
|
||||||
|
None # => None
|
||||||
|
|
||||||
|
# Non usare il simbolo di uguaglianza "==" per comparare oggetti a None
|
||||||
|
# Usa "is" invece
|
||||||
|
"etc" is None # => False
|
||||||
|
None is None # => True
|
||||||
|
|
||||||
|
# L'operatore 'is' testa l'identità di un oggetto. Questo non è
|
||||||
|
# molto utile quando non hai a che fare con valori primitivi, ma lo è
|
||||||
|
# quando hai a che fare con oggetti.
|
||||||
|
|
||||||
|
# None, 0, e stringhe/liste vuote sono tutte considerate a False.
|
||||||
|
# Tutti gli altri valori sono True
|
||||||
|
bool(0) # => False
|
||||||
|
bool("") # => False
|
||||||
|
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 2. Variabili e Collections
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# Python ha una funzione di stampa
|
||||||
|
print "Sono Python. Piacere di conoscerti!"
|
||||||
|
|
||||||
|
# Non c'è bisogno di dichiarare una variabile per assegnarle un valore
|
||||||
|
una_variabile = 5 # Convenzionalmente si usa caratteri_minuscoli_con_underscores
|
||||||
|
una_variabile # => 5
|
||||||
|
|
||||||
|
# Accedendo ad una variabile non precedentemente assegnata genera un'eccezione.
|
||||||
|
# Dai un'occhiata al Control Flow per imparare di più su come gestire le eccezioni.
|
||||||
|
un_altra_variabile # Genera un errore di nome
|
||||||
|
|
||||||
|
# if può essere usato come un'espressione
|
||||||
|
"yahoo!" if 3 > 2 else 2 # => "yahoo!"
|
||||||
|
|
||||||
|
# Liste immagazzinano sequenze
|
||||||
|
li = []
|
||||||
|
# Puoi partire con una lista pre-riempita
|
||||||
|
altra_li = [4, 5, 6]
|
||||||
|
|
||||||
|
# Aggiungi cose alla fine di una lista con append
|
||||||
|
li.append(1) # li ora è [1]
|
||||||
|
li.append(2) # li ora è [1, 2]
|
||||||
|
li.append(4) # li ora è [1, 2, 4]
|
||||||
|
li.append(3) # li ora è [1, 2, 4, 3]
|
||||||
|
# Rimuovi dalla fine della lista con pop
|
||||||
|
li.pop() # => 3 e li ora è [1, 2, 4]
|
||||||
|
# Rimettiamolo a posto
|
||||||
|
li.append(3) # li ora è [1, 2, 4, 3] di nuovo.
|
||||||
|
|
||||||
|
# Accedi ad una lista come faresti con un array
|
||||||
|
li[0] # => 1
|
||||||
|
# Assegna nuovo valore agli indici che sono già stati inizializzati con =
|
||||||
|
li[0] = 42
|
||||||
|
li[0] # => 42
|
||||||
|
li[0] = 1 # Nota: è resettato al valore iniziale
|
||||||
|
# Guarda l'ultimo elemento
|
||||||
|
li[-1] # => 3
|
||||||
|
|
||||||
|
# Guardare al di fuori dei limiti è un IndexError
|
||||||
|
li[4] # Genera IndexError
|
||||||
|
|
||||||
|
# Puoi guardare gli intervalli con la sintassi slice (a fetta).
|
||||||
|
# (E' un intervallo chiuso/aperto per voi tipi matematici.)
|
||||||
|
li[1:3] # => [2, 4]
|
||||||
|
# Ometti l'inizio
|
||||||
|
li[2:] # => [4, 3]
|
||||||
|
# Ometti la fine
|
||||||
|
li[:3] # => [1, 2, 4]
|
||||||
|
# Seleziona ogni seconda voce
|
||||||
|
li[::2] # =>[1, 4]
|
||||||
|
# Copia al contrario della lista
|
||||||
|
li[::-1] # => [3, 4, 2, 1]
|
||||||
|
# Usa combinazioni per fare slices avanzate
|
||||||
|
# li[inizio:fine:passo]
|
||||||
|
|
||||||
|
# Rimuovi arbitrariamente elementi da una lista con "del"
|
||||||
|
del li[2] # li è ora [1, 2, 3]
|
||||||
|
# Puoi sommare le liste
|
||||||
|
li + altra_li # => [1, 2, 3, 4, 5, 6]
|
||||||
|
# Nota: i valori per li ed altra_li non sono modificati.
|
||||||
|
|
||||||
|
# Concatena liste con "extend()"
|
||||||
|
li.extend(altra_li) # Ora li è [1, 2, 3, 4, 5, 6]
|
||||||
|
|
||||||
|
# Controlla l'esistenza di un valore in una lista con "in"
|
||||||
|
1 in li # => True
|
||||||
|
|
||||||
|
# Esamina la lunghezza con "len()"
|
||||||
|
len(li) # => 6
|
||||||
|
|
||||||
|
|
||||||
|
# Tuple sono come le liste ma immutabili.
|
||||||
|
tup = (1, 2, 3)
|
||||||
|
tup[0] # => 1
|
||||||
|
tup[0] = 3 # Genera un TypeError
|
||||||
|
|
||||||
|
# Puoi fare tutte queste cose da lista anche sulle tuple
|
||||||
|
len(tup) # => 3
|
||||||
|
tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6)
|
||||||
|
tup[:2] # => (1, 2)
|
||||||
|
2 in tup # => True
|
||||||
|
|
||||||
|
# Puoi scompattare le tuple (o liste) in variabili
|
||||||
|
a, b, c = (1, 2, 3) # a è ora 1, b è ora 2 and c è ora 3
|
||||||
|
# Le tuple sono create di default se non usi le parentesi
|
||||||
|
d, e, f = 4, 5, 6
|
||||||
|
# Guarda come è facile scambiare due valori
|
||||||
|
e, d = d, e # d è ora 5 ed e è ora 4
|
||||||
|
|
||||||
|
|
||||||
|
# Dizionari immagazzinano mappature
|
||||||
|
empty_dict = {}
|
||||||
|
# Questo è un dizionario pre-riempito
|
||||||
|
filled_dict = {"uno": 1, "due": 2, "tre": 3}
|
||||||
|
|
||||||
|
# Accedi ai valori con []
|
||||||
|
filled_dict["uno"] # => 1
|
||||||
|
|
||||||
|
# Ottieni tutte le chiavi come una lista con "keys()"
|
||||||
|
filled_dict.keys() # => ["tre", "due", "uno"]
|
||||||
|
# Nota - Nei dizionari l'ordine delle chiavi non è garantito.
|
||||||
|
# Il tuo risultato potrebbe non essere uguale a questo.
|
||||||
|
|
||||||
|
# Ottieni tutt i valori come una lista con "values()"
|
||||||
|
filled_dict.values() # => [3, 2, 1]
|
||||||
|
# Nota - Come sopra riguardo l'ordinamento delle chiavi.
|
||||||
|
|
||||||
|
# Controlla l'esistenza delle chiavi in un dizionario con "in"
|
||||||
|
"uno" in filled_dict # => True
|
||||||
|
1 in filled_dict # => False
|
||||||
|
|
||||||
|
# Cercando una chiave non esistente è un KeyError
|
||||||
|
filled_dict["quattro"] # KeyError
|
||||||
|
|
||||||
|
# Usa il metodo "get()" per evitare KeyError
|
||||||
|
filled_dict.get("uno") # => 1
|
||||||
|
filled_dict.get("quattro") # => None
|
||||||
|
# Il metodo get supporta un argomento di default quando il valore è mancante
|
||||||
|
filled_dict.get("uno", 4) # => 1
|
||||||
|
filled_dict.get("quattro", 4) # => 4
|
||||||
|
# nota che filled_dict.get("quattro") è ancora => None
|
||||||
|
# (get non imposta il valore nel dizionario)
|
||||||
|
|
||||||
|
# imposta il valore di una chiave con una sintassi simile alle liste
|
||||||
|
filled_dict["quattro"] = 4 # ora, filled_dict["quattro"] => 4
|
||||||
|
|
||||||
|
# "setdefault()" aggiunge al dizionario solo se la chiave data non è presente
|
||||||
|
filled_dict.setdefault("five", 5) # filled_dict["five"] è impostato a 5
|
||||||
|
filled_dict.setdefault("five", 6) # filled_dict["five"] è ancora 5
|
||||||
|
|
||||||
|
|
||||||
|
# Sets immagazzina ... sets (che sono come le liste, ma non possono contenere doppioni)
|
||||||
|
empty_set = set()
|
||||||
|
# Inizializza un "set()" con un po' di valori
|
||||||
|
some_set = set([1, 2, 2, 3, 4]) # some_set è ora set([1, 2, 3, 4])
|
||||||
|
|
||||||
|
# l'ordine non è garantito, anche se a volta può sembrare ordinato
|
||||||
|
another_set = set([4, 3, 2, 2, 1]) # another_set è ora set([1, 2, 3, 4])
|
||||||
|
|
||||||
|
# Da Python 2.7, {} può essere usato per dichiarare un set
|
||||||
|
filled_set = {1, 2, 2, 3, 4} # => {1, 2, 3, 4}
|
||||||
|
|
||||||
|
# Aggiungere elementi ad un set
|
||||||
|
filled_set.add(5) # filled_set è ora {1, 2, 3, 4, 5}
|
||||||
|
|
||||||
|
# Fai intersezioni su un set con &
|
||||||
|
other_set = {3, 4, 5, 6}
|
||||||
|
filled_set & other_set # => {3, 4, 5}
|
||||||
|
|
||||||
|
# Fai unioni su set con |
|
||||||
|
filled_set | other_set # => {1, 2, 3, 4, 5, 6}
|
||||||
|
|
||||||
|
# Fai differenze su set con -
|
||||||
|
{1, 2, 3, 4} - {2, 3, 5} # => {1, 4}
|
||||||
|
|
||||||
|
# Controlla l'esistenza in un set con in
|
||||||
|
2 in filled_set # => True
|
||||||
|
10 in filled_set # => False
|
||||||
|
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 3. Control Flow
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# Dichiariamo una variabile
|
||||||
|
some_var = 5
|
||||||
|
|
||||||
|
# Questo è un controllo if. L'indentazione è molto importante in python!
|
||||||
|
# stampa "some_var è più piccola di 10"
|
||||||
|
if some_var > 10:
|
||||||
|
print "some_var è decisamente più grande di 10."
|
||||||
|
elif some_var < 10: # Questa clausola elif è opzionale.
|
||||||
|
print "some_var è più piccola di 10."
|
||||||
|
else: # Anche questo è opzionale.
|
||||||
|
print "some_var è precisamente 10."
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
I cicli for iterano sulle liste
|
||||||
|
stampa:
|
||||||
|
cane è un mammifero
|
||||||
|
gatto è un mammifero
|
||||||
|
topo è un mammifero
|
||||||
|
"""
|
||||||
|
for animale in ["cane", "gatto", "topo"]:
|
||||||
|
# Puoi usare {0} per interpolare le stringhe formattate. (Vedi di seguito.)
|
||||||
|
print "{0} è un mammifero".format(animale)
|
||||||
|
|
||||||
|
"""
|
||||||
|
"range(numero)" restituisce una lista di numeri
|
||||||
|
da zero al numero dato
|
||||||
|
stampa:
|
||||||
|
0
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
"""
|
||||||
|
for i in range(4):
|
||||||
|
print i
|
||||||
|
|
||||||
|
"""
|
||||||
|
"range(lower, upper)" restituisce una lista di numeri
|
||||||
|
dal più piccolo (lower) al più grande (upper)
|
||||||
|
stampa:
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
"""
|
||||||
|
for i in range(4, 8):
|
||||||
|
print i
|
||||||
|
|
||||||
|
"""
|
||||||
|
I cicli while vengono eseguiti finchè una condizione viene a mancare
|
||||||
|
stampa:
|
||||||
|
0
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
"""
|
||||||
|
x = 0
|
||||||
|
while x < 4:
|
||||||
|
print x
|
||||||
|
x += 1 # Forma compatta per x = x + 1
|
||||||
|
|
||||||
|
# Gestisci le eccezioni con un blocco try/except
|
||||||
|
|
||||||
|
# Funziona da Python 2.6 in su:
|
||||||
|
try:
|
||||||
|
# Usa "raise" per generare un errore
|
||||||
|
raise IndexError("Questo è un errore di indice")
|
||||||
|
except IndexError as e:
|
||||||
|
pass # Pass è solo una non-operazione. Solitamente vorrai fare un recupero.
|
||||||
|
except (TypeError, NameError):
|
||||||
|
pass # Eccezioni multiple possono essere gestite tutte insieme, se necessario.
|
||||||
|
else: # Clausola opzionale al blocco try/except. Deve seguire tutti i blocchi except
|
||||||
|
print "Tutto ok!" # Viene eseguita solo se il codice dentro try non genera eccezioni
|
||||||
|
finally: # Eseguito sempre
|
||||||
|
print "Possiamo liberare risorse qui"
|
||||||
|
|
||||||
|
# Invece di try/finally per liberare risorse puoi usare il metodo with
|
||||||
|
with open("myfile.txt") as f:
|
||||||
|
for line in f:
|
||||||
|
print line
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 4. Funzioni
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# Usa "def" per creare nuove funzioni
|
||||||
|
def aggiungi(x, y):
|
||||||
|
print "x è {0} e y è {1}".format(x, y)
|
||||||
|
return x + y # Restituisce valori con il metodo return
|
||||||
|
|
||||||
|
# Chiamare funzioni con parametri
|
||||||
|
aggiungi(5, 6) # => stampa "x è 5 e y è 6" e restituisce 11
|
||||||
|
|
||||||
|
# Un altro modo per chiamare funzioni è con parole chiave come argomenti
|
||||||
|
aggiungi(y=6, x=5) # Le parole chiave come argomenti possono arrivare in ogni ordine.
|
||||||
|
|
||||||
|
|
||||||
|
# Puoi definire funzioni che accettano un numero variabile di argomenti posizionali
|
||||||
|
# che verranno interpretati come tuple se non usi il *
|
||||||
|
def varargs(*args):
|
||||||
|
return args
|
||||||
|
|
||||||
|
varargs(1, 2, 3) # => (1, 2, 3)
|
||||||
|
|
||||||
|
|
||||||
|
# Puoi definire funzioni che accettano un numero variabile di parole chiave
|
||||||
|
# come argomento, che saranno interpretati come un dizionario se non usi **
|
||||||
|
def keyword_args(**kwargs):
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
# Chiamiamola per vedere cosa succede
|
||||||
|
keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"}
|
||||||
|
|
||||||
|
|
||||||
|
# Puoi farle entrambi in una volta, se ti va
|
||||||
|
def all_the_args(*args, **kwargs):
|
||||||
|
print args
|
||||||
|
print kwargs
|
||||||
|
"""
|
||||||
|
all_the_args(1, 2, a=3, b=4) stampa:
|
||||||
|
(1, 2)
|
||||||
|
{"a": 3, "b": 4}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Quando chiami funzioni, puoi fare l'opposto di args/kwargs!
|
||||||
|
# Usa * per sviluppare gli argomenti posizionale ed usa ** per espandere gli argomenti parola chiave
|
||||||
|
args = (1, 2, 3, 4)
|
||||||
|
kwargs = {"a": 3, "b": 4}
|
||||||
|
all_the_args(*args) # equivalente a foo(1, 2, 3, 4)
|
||||||
|
all_the_args(**kwargs) # equivalente a foo(a=3, b=4)
|
||||||
|
all_the_args(*args, **kwargs) # equivalente a foo(1, 2, 3, 4, a=3, b=4)
|
||||||
|
|
||||||
|
# puoi passare args e kwargs insieme alle altre funzioni che accettano args/kwargs
|
||||||
|
# sviluppandoli, rispettivamente, con * e **
|
||||||
|
def pass_all_the_args(*args, **kwargs):
|
||||||
|
all_the_args(*args, **kwargs)
|
||||||
|
print varargs(*args)
|
||||||
|
print keyword_args(**kwargs)
|
||||||
|
|
||||||
|
# Funzioni Scope
|
||||||
|
x = 5
|
||||||
|
|
||||||
|
def setX(num):
|
||||||
|
# La variabile locale x non è uguale alla variabile globale x
|
||||||
|
x = num # => 43
|
||||||
|
print x # => 43
|
||||||
|
|
||||||
|
def setGlobalX(num):
|
||||||
|
global x
|
||||||
|
print x # => 5
|
||||||
|
x = num # la variabile globable x è ora 6
|
||||||
|
print x # => 6
|
||||||
|
|
||||||
|
setX(43)
|
||||||
|
setGlobalX(6)
|
||||||
|
|
||||||
|
# Python ha funzioni di prima classe
|
||||||
|
def create_adder(x):
|
||||||
|
def adder(y):
|
||||||
|
return x + y
|
||||||
|
return adder
|
||||||
|
|
||||||
|
add_10 = create_adder(10)
|
||||||
|
add_10(3) # => 13
|
||||||
|
|
||||||
|
# Ci sono anche funzioni anonime
|
||||||
|
(lambda x: x > 2)(3) # => True
|
||||||
|
|
||||||
|
# Esse sono incluse in funzioni di alto livello
|
||||||
|
map(add_10, [1, 2, 3]) # => [11, 12, 13]
|
||||||
|
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7]
|
||||||
|
|
||||||
|
# Possiamo usare la comprensione delle liste per mappe e filtri
|
||||||
|
[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. Classi
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# Usiamo una sottoclasse da un oggetto per avere una classe.
|
||||||
|
class Human(object):
|
||||||
|
|
||||||
|
# Un attributo della classe. E' condiviso da tutte le istanze delle classe
|
||||||
|
species = "H. sapiens"
|
||||||
|
|
||||||
|
# Costruttore base, richiamato quando la classe viene inizializzata.
|
||||||
|
# Si noti che il doppio leading e gli underscore finali denotano oggetti
|
||||||
|
# o attributi che sono usati da python ma che vivono nello spazio dei nome controllato
|
||||||
|
# dall'utente. Non dovresti usare nomi di questo genere.
|
||||||
|
def __init__(self, name):
|
||||||
|
# Assegna l'argomento all'attributo name dell'istanza
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
# Un metodo dell'istanza. Tutti i metodi prendo "self" come primo argomento
|
||||||
|
def say(self, msg):
|
||||||
|
return "{0}: {1}".format(self.name, msg)
|
||||||
|
|
||||||
|
# Un metodo della classe è condiviso fra tutte le istanze
|
||||||
|
# Sono chiamate con la classe chiamante come primo argomento
|
||||||
|
@classmethod
|
||||||
|
def get_species(cls):
|
||||||
|
return cls.species
|
||||||
|
|
||||||
|
# Un metodo statico è chiamato senza una classe od una istanza di riferimento
|
||||||
|
@staticmethod
|
||||||
|
def grunt():
|
||||||
|
return "*grunt*"
|
||||||
|
|
||||||
|
|
||||||
|
# Instanziare una classe
|
||||||
|
i = Human(name="Ian")
|
||||||
|
print i.say("hi") # stampa "Ian: hi"
|
||||||
|
|
||||||
|
j = Human("Joel")
|
||||||
|
print j.say("hello") # stampa "Joel: hello"
|
||||||
|
|
||||||
|
# Chiamare metodi della classe
|
||||||
|
i.get_species() # => "H. sapiens"
|
||||||
|
|
||||||
|
# Cambiare l'attributo condiviso
|
||||||
|
Human.species = "H. neanderthalensis"
|
||||||
|
i.get_species() # => "H. neanderthalensis"
|
||||||
|
j.get_species() # => "H. neanderthalensis"
|
||||||
|
|
||||||
|
# Chiamare il metodo condiviso
|
||||||
|
Human.grunt() # => "*grunt*"
|
||||||
|
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 6. Moduli
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# Puoi importare moduli
|
||||||
|
import math
|
||||||
|
print math.sqrt(16) # => 4
|
||||||
|
|
||||||
|
# Puoi ottenere specifiche funzione da un modulo
|
||||||
|
from math import ceil, floor
|
||||||
|
print ceil(3.7) # => 4.0
|
||||||
|
print floor(3.7) # => 3.0
|
||||||
|
|
||||||
|
# Puoi importare tutte le funzioni da un modulo
|
||||||
|
# Attenzione: questo non è raccomandato
|
||||||
|
from math import *
|
||||||
|
|
||||||
|
# Puoi abbreviare i nomi dei moduli
|
||||||
|
import math as m
|
||||||
|
math.sqrt(16) == m.sqrt(16) # => True
|
||||||
|
# puoi anche verificare che le funzioni sono equivalenti
|
||||||
|
from math import sqrt
|
||||||
|
math.sqrt == m.sqrt == sqrt # => True
|
||||||
|
|
||||||
|
# I moduli di Python sono normali file python. Ne puoi
|
||||||
|
# scrivere di tuoi ed importarli. Il nome del modulo
|
||||||
|
# è lo stesso del nome del file.
|
||||||
|
|
||||||
|
# Potete scoprire quali funzioni e attributi
|
||||||
|
# definiscono un modulo
|
||||||
|
import math
|
||||||
|
dir(math)
|
||||||
|
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 7. Avanzate
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# I generatori ti aiutano a fare codice pigro
|
||||||
|
def double_numbers(iterable):
|
||||||
|
for i in iterable:
|
||||||
|
yield i + i
|
||||||
|
|
||||||
|
# Un generatore crea valori al volo.
|
||||||
|
# Invece di generare e ritornare tutti i valori in una volta ne crea uno in ciascuna
|
||||||
|
# iterazione. Ciò significa che i valori più grandi di 15 non saranno considerati in
|
||||||
|
# double_numbers.
|
||||||
|
# Nota xrange è un generatore che fa la stessa cosa di range.
|
||||||
|
# Creare una lista 1-900000000 occuperebbe molto tempo e spazio.
|
||||||
|
# xrange crea un oggetto generatore xrange invece di creare l'intera lista
|
||||||
|
# come fa range.
|
||||||
|
# Usiamo un underscore finale nel nome delle variabile quando vogliamo usare un nome
|
||||||
|
# che normalmente colliderebbe con una parola chiave di python
|
||||||
|
xrange_ = xrange(1, 900000000)
|
||||||
|
|
||||||
|
# raddoppierà tutti i numeri fino a che result >=30 non sarà trovato
|
||||||
|
for i in double_numbers(xrange_):
|
||||||
|
print i
|
||||||
|
if i >= 30:
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
# Decoratori
|
||||||
|
# in questo esempio beg include say
|
||||||
|
# Beg chiamerà say. Se say_please è True allora cambierà il messaggio
|
||||||
|
# ritornato
|
||||||
|
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, "Per favore! Sono povero :(")
|
||||||
|
return msg
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
@beg
|
||||||
|
def say(say_please=False):
|
||||||
|
msg = "Puoi comprarmi una birra?"
|
||||||
|
return msg, say_please
|
||||||
|
|
||||||
|
|
||||||
|
print say() # Puoi comprarmi una birra?
|
||||||
|
print say(say_please=True) # Puoi comprarmi una birra? Per favore! Sono povero :(
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pronto per qualcosa di più?
|
||||||
|
|
||||||
|
### Gratis Online
|
||||||
|
|
||||||
|
* [Automate the Boring Stuff with Python](https://automatetheboringstuff.com)
|
||||||
|
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
|
||||||
|
* [Dive Into Python](http://www.diveintopython.net/)
|
||||||
|
* [The Official Docs](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)
|
||||||
|
* [First Steps With Python](https://realpython.com/learn/python-first-steps/)
|
||||||
|
|
||||||
|
### Libri cartacei
|
||||||
|
|
||||||
|
* [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)
|
@ -535,7 +535,7 @@ class PennyFarthing extends Bicycle {
|
|||||||
// (Penny Farthings are those bicycles with the big front wheel.
|
// (Penny Farthings are those bicycles with the big front wheel.
|
||||||
// They have no gears.)
|
// They have no gears.)
|
||||||
|
|
||||||
public PennyFarthing(int startCadence, int startSpeed){
|
public PennyFarthing(int startCadence, int startSpeed) {
|
||||||
// Call the parent constructor with super
|
// Call the parent constructor with super
|
||||||
super(startCadence, startSpeed, 0, "PennyFarthing");
|
super(startCadence, startSpeed, 0, "PennyFarthing");
|
||||||
}
|
}
|
||||||
|
@ -151,12 +151,16 @@ a = Int64[] # => 0-element Int64 Array
|
|||||||
|
|
||||||
# 1-dimensional array literals can be written with comma-separated values.
|
# 1-dimensional array literals can be written with comma-separated values.
|
||||||
b = [4, 5, 6] # => 3-element Int64 Array: [4, 5, 6]
|
b = [4, 5, 6] # => 3-element Int64 Array: [4, 5, 6]
|
||||||
|
b = [4; 5; 6] # => 3-element Int64 Array: [4, 5, 6]
|
||||||
b[1] # => 4
|
b[1] # => 4
|
||||||
b[end] # => 6
|
b[end] # => 6
|
||||||
|
|
||||||
# 2-dimentional arrays use space-separated values and semicolon-separated rows.
|
# 2-dimentional arrays use space-separated values and semicolon-separated rows.
|
||||||
matrix = [1 2; 3 4] # => 2x2 Int64 Array: [1 2; 3 4]
|
matrix = [1 2; 3 4] # => 2x2 Int64 Array: [1 2; 3 4]
|
||||||
|
|
||||||
|
# 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!
|
# Add stuff to the end of a list with push! and append!
|
||||||
push!(a,1) # => [1]
|
push!(a,1) # => [1]
|
||||||
push!(a,2) # => [1,2]
|
push!(a,2) # => [1,2]
|
||||||
|
@ -26,6 +26,7 @@ specific to a certain parser.
|
|||||||
|
|
||||||
## HTML Elements
|
## HTML Elements
|
||||||
Markdown is a superset of HTML, so any HTML file is valid Markdown.
|
Markdown is a superset of HTML, so any HTML file is valid Markdown.
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
<!--This means we can use HTML elements in Markdown, such as the comment element,
|
<!--This means we can use HTML elements in Markdown, such as the comment element,
|
||||||
and they won't be affected by a markdown parser. However, if you create an HTML element
|
and they won't be affected by a markdown parser. However, if you create an HTML element
|
||||||
@ -54,6 +55,7 @@ This is an h1
|
|||||||
This is an h2
|
This is an h2
|
||||||
-------------
|
-------------
|
||||||
```
|
```
|
||||||
|
|
||||||
## Simple text styles
|
## Simple text styles
|
||||||
|
|
||||||
Text can be easily styled as italic or bold using markdown.
|
Text can be easily styled as italic or bold using markdown.
|
||||||
@ -133,6 +135,7 @@ or
|
|||||||
- Item
|
- Item
|
||||||
- One last item
|
- One last item
|
||||||
```
|
```
|
||||||
|
|
||||||
Ordered lists are done with a number followed by a period.
|
Ordered lists are done with a number followed by a period.
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
@ -152,6 +155,7 @@ render the numbers in order, but this may not be a good idea.
|
|||||||
(This renders the same as the above example)
|
(This renders the same as the above example)
|
||||||
|
|
||||||
You can also use sublists
|
You can also use sublists
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
1. Item one
|
1. Item one
|
||||||
2. Item two
|
2. Item two
|
||||||
@ -197,13 +201,13 @@ John didn't even know what the `go_to()` function did!
|
|||||||
```
|
```
|
||||||
|
|
||||||
In Github Flavored Markdown, you can use a special syntax for code
|
In Github Flavored Markdown, you can use a special syntax for code
|
||||||
```markdown
|
|
||||||
\`\`\`ruby <!-- except remove those backslashes when you do this, just ```ruby ! -->
|
<pre>
|
||||||
|
<code class="highlight">```ruby
|
||||||
def foobar
|
def foobar
|
||||||
puts "Hello world!"
|
puts "Hello world!"
|
||||||
end
|
end
|
||||||
\`\`\` <!-- here too, no backslashes, just ``` -->
|
```</code></pre>
|
||||||
```
|
|
||||||
|
|
||||||
The above text doesn't require indenting, plus Github will use syntax
|
The above text doesn't require indenting, plus Github will use syntax
|
||||||
highlighting of the language you specify after the \`\`\`
|
highlighting of the language you specify after the \`\`\`
|
||||||
@ -212,6 +216,7 @@ highlighting of the language you specify after the \`\`\`
|
|||||||
|
|
||||||
Horizontal rules (`<hr/>`) are easily added with three or more asterisks or hyphens,
|
Horizontal rules (`<hr/>`) are easily added with three or more asterisks or hyphens,
|
||||||
with or without spaces.
|
with or without spaces.
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
***
|
***
|
||||||
---
|
---
|
||||||
@ -228,58 +233,64 @@ the text to display in hard brackets [] followed by the url in parentheses ()
|
|||||||
[Click me!](http://test.com/)
|
[Click me!](http://test.com/)
|
||||||
```
|
```
|
||||||
You can also add a link title using quotes inside the parentheses.
|
You can also add a link title using quotes inside the parentheses.
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
[Click me!](http://test.com/ "Link to Test.com")
|
[Click me!](http://test.com/ "Link to Test.com")
|
||||||
```
|
```
|
||||||
Relative paths work too.
|
Relative paths work too.
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
[Go to music](/music/).
|
[Go to music](/music/).
|
||||||
```
|
```
|
||||||
Markdown also supports reference style links.
|
|
||||||
```markdown
|
|
||||||
[Click this link][link1] for more info about it!
|
|
||||||
[Also check out this link][foobar] if you want to.
|
|
||||||
|
|
||||||
[link1]: http://test.com/ "Cool!"
|
Markdown also supports reference style links.
|
||||||
[foobar]: http://foobar.biz/ "Alright!"
|
|
||||||
```
|
<pre><code class="highlight">[<span class="nv">Click this link</span>][<span class="ss">link1</span>] for more info about it!
|
||||||
|
[<span class="nv">Also check out this link</span>][<span class="ss">foobar</span>] if you want to.
|
||||||
|
|
||||||
|
[<span class="nv">link1</span>]: <span class="sx">http://test.com/</span> <span class="nn">"Cool!"</span>
|
||||||
|
[<span class="nv">foobar</span>]: <span class="sx">http://foobar.biz/</span> <span class="nn">"Alright!"</span></code></pre>
|
||||||
|
|
||||||
The title can also be in single quotes or in parentheses, or omitted
|
The title can also be in single quotes or in parentheses, or omitted
|
||||||
entirely. The references can be anywhere in your document and the reference IDs
|
entirely. The references can be anywhere in your document and the reference IDs
|
||||||
can be anything so long as they are unique.
|
can be anything so long as they are unique.
|
||||||
|
|
||||||
There is also "implicit naming" which lets you use the link text as the id.
|
There is also "implicit naming" which lets you use the link text as the id.
|
||||||
```markdown
|
|
||||||
[This][] is a link.
|
|
||||||
|
|
||||||
[this]: http://thisisalink.com/
|
<pre><code class="highlight">[<span class="nv">This</span>][] is a link.
|
||||||
```
|
|
||||||
|
[<span class="nv">this</span>]: <span class="sx">http://thisisalink.com/</span></code></pre>
|
||||||
|
|
||||||
But it's not that commonly used.
|
But it's not that commonly used.
|
||||||
|
|
||||||
## Images
|
## Images
|
||||||
Images are done the same way as links but with an exclamation point in front!
|
Images are done the same way as links but with an exclamation point in front!
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||

|

|
||||||
```
|
```
|
||||||
|
|
||||||
And reference style works as expected.
|
And reference style works as expected.
|
||||||
```markdown
|
|
||||||
![This is the alt-attribute.][myimage]
|
|
||||||
|
|
||||||
[myimage]: relative/urls/cool/image.jpg "if you need a title, it's here"
|
<pre><code class="highlight">![<span class="nv">This is the alt-attribute.</span>][<span class="ss">myimage</span>]
|
||||||
```
|
|
||||||
|
|
||||||
|
[<span class="nv">myimage</span>]: <span class="sx">relative/urls/cool/image.jpg</span> <span class="nn">"if you need a title, it's here"</span></code></pre>
|
||||||
## Miscellany
|
## Miscellany
|
||||||
### Auto-links
|
### Auto-links
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
<http://testwebsite.com/> is equivalent to
|
<http://testwebsite.com/> is equivalent to
|
||||||
[http://testwebsite.com/](http://testwebsite.com/)
|
[http://testwebsite.com/](http://testwebsite.com/)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Auto-links for emails
|
### Auto-links for emails
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
<foo@bar.com>
|
<foo@bar.com>
|
||||||
```
|
```
|
||||||
|
|
||||||
### Escaping characters
|
### Escaping characters
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
I want to type *this text surrounded by asterisks* but I don't want it to be
|
I want to type *this text surrounded by asterisks* but I don't want it to be
|
||||||
in italics, so I do this: \*this text surrounded by asterisks\*.
|
in italics, so I do this: \*this text surrounded by asterisks\*.
|
||||||
@ -288,6 +299,7 @@ in italics, so I do this: \*this text surrounded by asterisks\*.
|
|||||||
### Keyboard keys
|
### Keyboard keys
|
||||||
|
|
||||||
In Github Flavored Markdown, you can use a `<kbd>` tag to represent keyboard keys.
|
In Github Flavored Markdown, you can use a `<kbd>` tag to represent keyboard keys.
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
Your computer crashed? Try sending a
|
Your computer crashed? Try sending a
|
||||||
<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd>
|
<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd>
|
||||||
@ -296,6 +308,7 @@ Your computer crashed? Try sending a
|
|||||||
|
|
||||||
Tables are only available in Github Flavored Markdown and are slightly
|
Tables are only available in Github Flavored Markdown and are slightly
|
||||||
cumbersome, but if you really want it:
|
cumbersome, but if you really want it:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
| Col1 | Col2 | Col3 |
|
| Col1 | Col2 | Col3 |
|
||||||
| :----------- | :------: | ------------: |
|
| :----------- | :------: | ------------: |
|
||||||
@ -309,5 +322,6 @@ Col 1 | Col2 | Col3
|
|||||||
:-- | :-: | --:
|
:-- | :-: | --:
|
||||||
Ugh this is so ugly | make it | stop
|
Ugh this is so ugly | make it | stop
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
For more info, check out John Gruber's official post of syntax [here](http://daringfireball.net/projects/markdown/syntax) and Adam Pritchard's great cheatsheet [here](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
|
For more info, check out John Gruber's official post of syntax [here](http://daringfireball.net/projects/markdown/syntax) and Adam Pritchard's great cheatsheet [here](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
|
||||||
|
102
ms-my/json-my.html.markdown
Normal file
102
ms-my/json-my.html.markdown
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
---
|
||||||
|
language: json
|
||||||
|
filename: learnjson-ms.json
|
||||||
|
contributors:
|
||||||
|
- ["Anna Harren", "https://github.com/iirelu"]
|
||||||
|
- ["Marco Scannadinari", "https://github.com/marcoms"]
|
||||||
|
- ["himanshu", "https://github.com/himanshu81494"]
|
||||||
|
- ["Michael Neth", "https://github.com/infernocloud"]
|
||||||
|
translators:
|
||||||
|
- ["abdalim", "https://github.com/abdalim"]
|
||||||
|
lang: ms-my
|
||||||
|
---
|
||||||
|
|
||||||
|
Disebabkan JSON adalah format pertukaran-data yang sangat ringkas, panduan ini
|
||||||
|
kemungkinan besar adalah Learn X in Y Minutes yang paling mudah.
|
||||||
|
|
||||||
|
JSON dalam bentuk paling aslinya sebenarnya tidak mempunyai sebarang komentar,
|
||||||
|
tetapi kebanyakan pembaca menerima komen dalam bentuk C (`\\`,`/* */`). Beberapa
|
||||||
|
pembaca juga bertoleransi terhadap koma terakhir (iaitu koma selepas elemen
|
||||||
|
terakhir di dalam array atau selepas ciri terakhir sesuatu objek), tetapi semua
|
||||||
|
ini harus dielakkan dan dijauhkan untuk keserasian yang lebih baik.
|
||||||
|
|
||||||
|
Untuk tujuan ini bagaimanapun, semua di dalam panduan ini adalah 100% JSON yang
|
||||||
|
sah. Luckily, it kind of speaks for itself.
|
||||||
|
|
||||||
|
Sebuah nilai JSON harus terdiri dari salah satu, iaitu, nombor, string, array,
|
||||||
|
objek atau salah satu dari nama literal berikut: true, false, null.
|
||||||
|
|
||||||
|
Pelayar web yang menyokong adalah: Firefox 3.5+, Internet Explorer 8.0+, Chrome
|
||||||
|
1.0+, Opera 10.0+, dan Safari 4.0+.
|
||||||
|
|
||||||
|
Sambungan fail untuk fail - fail JSON adalah ".json" dan jenis MIME untuk teks
|
||||||
|
JSON adalah "application/json".
|
||||||
|
|
||||||
|
Banyak bahasa aturcara mempunyai fungsi untuk menyirikan (mengekod) dan
|
||||||
|
menyah-sirikan (men-dekod) data JSON kepada struktur data asal. Javascript
|
||||||
|
mempunyai sokongon tersirat untuk memanipulasi teks JSON sebagai data.
|
||||||
|
|
||||||
|
Maklumat lebih lanjut boleh dijumpai di http://www.json.org/
|
||||||
|
|
||||||
|
JSON dibina pada dua struktur:
|
||||||
|
* Sebuah koleksi pasangan nama/nilai. Di dalam pelbagai bahasa aturcara, ini
|
||||||
|
direalisasikan sebagai objek, rekod, "struct", "dictionary", "hash table",
|
||||||
|
senarai berkunci, atau "associative array".
|
||||||
|
* Sebuah senarai nilai yang tersusun. Dalam kebanyakan bahasa aturcara, ini
|
||||||
|
direalisasikan sebagai array, vektor, senarai atau urutan.
|
||||||
|
|
||||||
|
Sebuah objek dengan pelbagai pasangan nama/nilai.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"kunci": "nilai",
|
||||||
|
|
||||||
|
"kekunci": "harus sentiasa dibalut dengan 'double quotes'",
|
||||||
|
"nombor": 0,
|
||||||
|
"strings": "Hellø, wørld. Semua unicode dibenarkan, bersama \"escaping\".",
|
||||||
|
"ada bools?": true,
|
||||||
|
"tiada apa - apa": null,
|
||||||
|
|
||||||
|
"nombor besar": 1.2e+100,
|
||||||
|
|
||||||
|
"objek": {
|
||||||
|
"komen": "Sebahagian besar struktur akan terdiri daripada objek.",
|
||||||
|
|
||||||
|
"array": [0, 1, 2, 3, "Array boleh mempunyai sebarang jenis data di dalamnya.", 5],
|
||||||
|
|
||||||
|
"objek lain": {
|
||||||
|
"komen": "Objek boleh dibina dengan pelbagai lapisan, sangat berguna."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"kebendulan": [
|
||||||
|
{
|
||||||
|
"punca potassium": ["pisang"]
|
||||||
|
},
|
||||||
|
[
|
||||||
|
[1, 0, 0, 0],
|
||||||
|
[0, 1, 0, 0],
|
||||||
|
[0, 0, 1, "neo"],
|
||||||
|
[0, 0, 0, 1]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
|
||||||
|
"stail alternatif": {
|
||||||
|
"komen": "cuba lihat ini!"
|
||||||
|
, "posisi koma": "tidak mengapa - selagi ia adalah sebelum nama atau kunci seterusnya, maka ia sah"
|
||||||
|
, "komen lain": "sungguh bagus"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Sebuah array sahaja yang mengandungi nilai - nilai juga adalah JSON yang sah.
|
||||||
|
|
||||||
|
```json
|
||||||
|
[1, 2, 3, "text", true]
|
||||||
|
```
|
||||||
|
|
||||||
|
Objek - objek boleh menjadi sebahagian dari array juga.
|
||||||
|
|
||||||
|
```json
|
||||||
|
[{"nama": "Abe", "umur": 25}, {"nama": "Jemah", "umur": 29}, {"name": "Yob", "umur": 31}]
|
||||||
|
```
|
@ -103,7 +103,7 @@ sub say-hello-to(Str $name) { # You can provide the type of an argument
|
|||||||
|
|
||||||
## It can also have optional arguments:
|
## It can also have optional arguments:
|
||||||
sub with-optional($arg?) { # the "?" marks the argument optional
|
sub with-optional($arg?) { # the "?" marks the argument optional
|
||||||
say "I might return `(Any)` (Perl's "null"-like value) if I don't have
|
say "I might return `(Any)` (Perl's 'null'-like value) if I don't have
|
||||||
an argument passed, or I'll return my argument";
|
an argument passed, or I'll return my argument";
|
||||||
$arg;
|
$arg;
|
||||||
}
|
}
|
||||||
@ -803,9 +803,8 @@ module Foo::Bar {
|
|||||||
my sub unavailable { # `my sub` is the default
|
my sub unavailable { # `my sub` is the default
|
||||||
say "Can't access me from outside, I'm my !";
|
say "Can't access me from outside, I'm my !";
|
||||||
}
|
}
|
||||||
|
say ++$n; # increment the package variable and output its value
|
||||||
}
|
}
|
||||||
|
|
||||||
say ++$n; # lexically-scoped variables are still available
|
|
||||||
}
|
}
|
||||||
say $Foo::Bar::n; #=> 1
|
say $Foo::Bar::n; #=> 1
|
||||||
Foo::Bar::inc; #=> 2
|
Foo::Bar::inc; #=> 2
|
||||||
@ -1330,7 +1329,7 @@ so 'ayc' ~~ / a [ b | y ] c /; # `True`. Obviously enough ...
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Extra: the MAIN subroutime
|
### Extra: the MAIN subroutine
|
||||||
# The `MAIN` subroutine is called when you run a Perl 6 file directly.
|
# The `MAIN` subroutine is called when you run a Perl 6 file directly.
|
||||||
# It's very powerful, because Perl 6 actually parses the arguments
|
# It's very powerful, because Perl 6 actually parses the arguments
|
||||||
# and pass them as such to the sub. It also handles named argument (`--foo`)
|
# and pass them as such to the sub. It also handles named argument (`--foo`)
|
||||||
|
@ -53,6 +53,8 @@ $int1 = 12; // => 12
|
|||||||
$int2 = -12; // => -12
|
$int2 = -12; // => -12
|
||||||
$int3 = 012; // => 10 (a leading 0 denotes an octal number)
|
$int3 = 012; // => 10 (a leading 0 denotes an octal number)
|
||||||
$int4 = 0x0F; // => 15 (a leading 0x denotes a hex literal)
|
$int4 = 0x0F; // => 15 (a leading 0x denotes a hex literal)
|
||||||
|
// Binary integer literals are available since PHP 5.4.0.
|
||||||
|
$int5 = 0b11111111; // 255 (a leading 0b denotes a binary number)
|
||||||
|
|
||||||
// Floats (aka doubles)
|
// Floats (aka doubles)
|
||||||
$float = 1.234;
|
$float = 1.234;
|
||||||
@ -120,7 +122,7 @@ define("FOO", "something");
|
|||||||
|
|
||||||
// access to a constant is possible by calling the choosen name without a $
|
// access to a constant is possible by calling the choosen name without a $
|
||||||
echo FOO; // Returns 'something'
|
echo FOO; // Returns 'something'
|
||||||
echo 'This outputs '.FOO; // Returns 'This ouputs something'
|
echo 'This outputs ' . FOO; // Returns 'This ouputs something'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -765,6 +767,37 @@ I'm a ParentClass
|
|||||||
But I'm ChildClass
|
But I'm ChildClass
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**********************
|
||||||
|
* Magic constants
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Get current class name. Must be used inside a class declaration.
|
||||||
|
echo "Current class name is " . __CLASS__;
|
||||||
|
|
||||||
|
// Get full path directory of a file
|
||||||
|
echo "Current directory is " . __DIR__;
|
||||||
|
|
||||||
|
// Typical usage
|
||||||
|
require __DIR__ . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
// Get full path of a file
|
||||||
|
echo "Current file path is " . __FILE__;
|
||||||
|
|
||||||
|
// Get current function name
|
||||||
|
echo "Current function name is " . __FUNCTION__;
|
||||||
|
|
||||||
|
// Get current line number
|
||||||
|
echo "Current line number is " . __LINE__;
|
||||||
|
|
||||||
|
// Get the name of the current method. Only returns a value when used inside a trait or object declaration.
|
||||||
|
echo "Current method is " . __METHOD__;
|
||||||
|
|
||||||
|
// Get the name of the current namespace
|
||||||
|
echo "Current namespace is " . __NAMESPACE__;
|
||||||
|
|
||||||
|
// Get the name of the current trait. Only returns a value when used inside a trait or object declaration.
|
||||||
|
echo "Current namespace is " . __TRAIT__;
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* Error Handling
|
* Error Handling
|
||||||
|
@ -18,6 +18,7 @@ rather than plain text.
|
|||||||
[Read more here.](https://technet.microsoft.com/en-us/library/bb978526.aspx)
|
[Read more here.](https://technet.microsoft.com/en-us/library/bb978526.aspx)
|
||||||
|
|
||||||
If you are uncertain about your environment:
|
If you are uncertain about your environment:
|
||||||
|
|
||||||
```
|
```
|
||||||
Get-ExecutionPolicy -List
|
Get-ExecutionPolicy -List
|
||||||
Set-ExecutionPolicy AllSigned
|
Set-ExecutionPolicy AllSigned
|
||||||
@ -33,6 +34,7 @@ $PSVersionTable
|
|||||||
```
|
```
|
||||||
|
|
||||||
Getting help:
|
Getting help:
|
||||||
|
|
||||||
```
|
```
|
||||||
# Find commands
|
# Find commands
|
||||||
Get-Command about_* # alias: gcm
|
Get-Command about_* # alias: gcm
|
||||||
@ -49,6 +51,7 @@ Update-Help # Run as admin
|
|||||||
```
|
```
|
||||||
|
|
||||||
The tutorial starts here:
|
The tutorial starts here:
|
||||||
|
|
||||||
```
|
```
|
||||||
# As you already figured, comments start with #
|
# As you already figured, comments start with #
|
||||||
|
|
||||||
@ -244,10 +247,12 @@ function New-Website() {
|
|||||||
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
|
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
|
||||||
|
|
||||||
# Note that .NET functions MUST be called with parentheses
|
# Note that .NET functions MUST be called with parentheses
|
||||||
# while PS functions CANNOT be called with parentheses
|
# while PS functions CANNOT be called with parentheses.
|
||||||
|
# If you do call a cmdlet/PS function with parentheses,
|
||||||
|
# it is the same as passing a single parameter list
|
||||||
$writer = New-Object System.IO.StreamWriter($path, $true)
|
$writer = New-Object System.IO.StreamWriter($path, $true)
|
||||||
$writer.Write([Environment]::NewLine)
|
$writer.Write([Environment]::NewLine)
|
||||||
$write.Dispose()
|
$writer.Dispose()
|
||||||
|
|
||||||
### IO
|
### IO
|
||||||
# Reading a value from input:
|
# Reading a value from input:
|
||||||
@ -265,12 +270,14 @@ Get-Command ConvertTo-*,ConvertFrom-*
|
|||||||
# Refresh your PATH
|
# Refresh your PATH
|
||||||
$env:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") +
|
$env:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") +
|
||||||
";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
|
";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
|
||||||
|
|
||||||
# Find Python in path
|
# Find Python in path
|
||||||
$env:PATH.Split(";") | Where-Object { $_ -like "*python*"}
|
$env:PATH.Split(";") | Where-Object { $_ -like "*python*"}
|
||||||
|
|
||||||
# Change working directory without having to remember previous path
|
# Change working directory without having to remember previous path
|
||||||
Push-Location c:\temp # change working directory to c:\temp
|
Push-Location c:\temp # change working directory to c:\temp
|
||||||
Pop-Location # change back to previous working directory
|
Pop-Location # change back to previous working directory
|
||||||
|
# Aliases are: pushd and popd
|
||||||
|
|
||||||
# Unblock a directory after download
|
# Unblock a directory after download
|
||||||
Get-ChildItem -Recurse | Unblock-File
|
Get-ChildItem -Recurse | Unblock-File
|
||||||
@ -292,6 +299,7 @@ $Shortcut.Save()
|
|||||||
|
|
||||||
|
|
||||||
Configuring your shell
|
Configuring your shell
|
||||||
|
|
||||||
```
|
```
|
||||||
# $Profile is the full path for your `Microsoft.PowerShell_profile.ps1`
|
# $Profile is the full path for your `Microsoft.PowerShell_profile.ps1`
|
||||||
# All code there will be executed when the PS session starts
|
# All code there will be executed when the PS session starts
|
||||||
@ -304,6 +312,7 @@ if (-not (Test-Path $Profile)) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
Interesting Projects
|
Interesting Projects
|
||||||
|
|
||||||
* [Channel9](https://channel9.msdn.com/Search?term=powershell%20pipeline#ch9Search&lang-en=en) PowerShell tutorials
|
* [Channel9](https://channel9.msdn.com/Search?term=powershell%20pipeline#ch9Search&lang-en=en) PowerShell tutorials
|
||||||
* [PSGet](https://github.com/psget/psget) NuGet for PowerShell
|
* [PSGet](https://github.com/psget/psget) NuGet for PowerShell
|
||||||
* [PSReadLine](https://github.com/lzybkr/PSReadLine/) A bash inspired readline implementation for PowerShell (So good that it now ships with Windows10 by default!)
|
* [PSReadLine](https://github.com/lzybkr/PSReadLine/) A bash inspired readline implementation for PowerShell (So good that it now ships with Windows10 by default!)
|
||||||
@ -314,6 +323,7 @@ Interesting Projects
|
|||||||
* [PowerShell Community Extensions](http://pscx.codeplex.com/) (Dead)
|
* [PowerShell Community Extensions](http://pscx.codeplex.com/) (Dead)
|
||||||
|
|
||||||
Not covered
|
Not covered
|
||||||
|
|
||||||
* WMI: Windows Management Intrumentation (Get-CimInstance)
|
* WMI: Windows Management Intrumentation (Get-CimInstance)
|
||||||
* Multitasking: Start-Job -scriptBlock {...},
|
* Multitasking: Start-Job -scriptBlock {...},
|
||||||
* Code Signing
|
* Code Signing
|
||||||
|
@ -726,6 +726,7 @@ print say(say_please=True) # Can you buy me a beer? Please! I am poor :(
|
|||||||
* [Python Module of the Week](http://pymotw.com/2/)
|
* [Python Module of the Week](http://pymotw.com/2/)
|
||||||
* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182)
|
* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182)
|
||||||
* [First Steps With Python](https://realpython.com/learn/python-first-steps/)
|
* [First Steps With Python](https://realpython.com/learn/python-first-steps/)
|
||||||
|
* [Fullstack Python](https://www.fullstackpython.com/)
|
||||||
|
|
||||||
### Dead Tree
|
### Dead Tree
|
||||||
|
|
||||||
|
@ -97,13 +97,13 @@ False or True # => True
|
|||||||
1 < 2 < 3 # => True
|
1 < 2 < 3 # => True
|
||||||
2 < 3 < 2 # => False
|
2 < 3 < 2 # => False
|
||||||
|
|
||||||
# (is vs. ==) is checks if two variable refer to the same object, but == checks
|
# (is vs. ==) is checks if two variables refer to the same object, but == checks
|
||||||
# if the objects pointed to have the same values.
|
# if the objects pointed to have the same values.
|
||||||
a = [1, 2, 3, 4] # Point a at a new list, [1, 2, 3, 4]
|
a = [1, 2, 3, 4] # Point a at a new list, [1, 2, 3, 4]
|
||||||
b = a # Point b at what a is pointing to
|
b = a # Point b at what a is pointing to
|
||||||
b is a # => True, a and b refer to the same object
|
b is a # => True, a and b refer to the same object
|
||||||
b == a # => True, a's and b's objects are equal
|
b == a # => True, a's and b's objects are equal
|
||||||
b = [1, 2, 3, 4] # Point a at a new list, [1, 2, 3, 4]
|
b = [1, 2, 3, 4] # Point b at a new list, [1, 2, 3, 4]
|
||||||
b is a # => False, a and b do not refer to the same object
|
b is a # => False, a and b do not refer to the same object
|
||||||
b == a # => True, a's and b's objects are equal
|
b == a # => True, a's and b's objects are equal
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@ This is a tutorial on how to do some typical statistical programming tasks using
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 0. Getting set up ====
|
# 0. Getting set up ====
|
||||||
|
|
||||||
""" Get set up with IPython and pip install the following: numpy, scipy, pandas,
|
""" Get set up with IPython and pip install the following: numpy, scipy, pandas,
|
||||||
@ -35,7 +37,7 @@ r.text # raw page source
|
|||||||
print(r.text) # prettily formatted
|
print(r.text) # prettily formatted
|
||||||
# save the page source in a file:
|
# save the page source in a file:
|
||||||
os.getcwd() # check what's the working directory
|
os.getcwd() # check what's the working directory
|
||||||
f = open("learnxinyminutes.html","wb")
|
f = open("learnxinyminutes.html", "wb")
|
||||||
f.write(r.text.encode("UTF-8"))
|
f.write(r.text.encode("UTF-8"))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
@ -44,7 +46,7 @@ fp = "https://raw.githubusercontent.com/adambard/learnxinyminutes-docs/master/"
|
|||||||
fn = "pets.csv"
|
fn = "pets.csv"
|
||||||
r = requests.get(fp + fn)
|
r = requests.get(fp + fn)
|
||||||
print(r.text)
|
print(r.text)
|
||||||
f = open(fn,"wb")
|
f = open(fn, "wb")
|
||||||
f.write(r.text.encode("UTF-8"))
|
f.write(r.text.encode("UTF-8"))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
@ -58,7 +60,9 @@ f.close()
|
|||||||
you've used R, you will be familiar with the idea of the "data.frame" already.
|
you've used R, you will be familiar with the idea of the "data.frame" already.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import pandas as pd, numpy as np, scipy as sp
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
import scipy as sp
|
||||||
pets = pd.read_csv(fn)
|
pets = pd.read_csv(fn)
|
||||||
pets
|
pets
|
||||||
# name age weight species
|
# name age weight species
|
||||||
@ -86,7 +90,7 @@ pets.age[0:2]
|
|||||||
# 0 3
|
# 0 3
|
||||||
# 1 6
|
# 1 6
|
||||||
|
|
||||||
sum(pets.age)*2 # 28
|
sum(pets.age) * 2 # 28
|
||||||
max(pets.weight) - min(pets.weight) # 20
|
max(pets.weight) - min(pets.weight) # 20
|
||||||
|
|
||||||
""" If you are doing some serious linear algebra and number-crunching, you may
|
""" If you are doing some serious linear algebra and number-crunching, you may
|
||||||
@ -96,7 +100,8 @@ max(pets.weight) - min(pets.weight) # 20
|
|||||||
|
|
||||||
# 3. Charts ====
|
# 3. Charts ====
|
||||||
|
|
||||||
import matplotlib as mpl, matplotlib.pyplot as plt
|
import matplotlib as mpl
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
%matplotlib inline
|
%matplotlib inline
|
||||||
|
|
||||||
# To do data vizualization in Python, use matplotlib
|
# To do data vizualization in Python, use matplotlib
|
||||||
@ -105,13 +110,17 @@ plt.hist(pets.age);
|
|||||||
|
|
||||||
plt.boxplot(pets.weight);
|
plt.boxplot(pets.weight);
|
||||||
|
|
||||||
plt.scatter(pets.age, pets.weight); plt.xlabel("age"); plt.ylabel("weight");
|
plt.scatter(pets.age, pets.weight)
|
||||||
|
plt.xlabel("age")
|
||||||
|
plt.ylabel("weight");
|
||||||
|
|
||||||
# seaborn sits atop matplotlib and makes plots prettier
|
# seaborn sits atop matplotlib and makes plots prettier
|
||||||
|
|
||||||
import seaborn as sns
|
import seaborn as sns
|
||||||
|
|
||||||
plt.scatter(pets.age, pets.weight); plt.xlabel("age"); plt.ylabel("weight");
|
plt.scatter(pets.age, pets.weight)
|
||||||
|
plt.xlabel("age")
|
||||||
|
plt.ylabel("weight");
|
||||||
|
|
||||||
# there are also some seaborn-specific plotting functions
|
# there are also some seaborn-specific plotting functions
|
||||||
# notice how seaborn automatically labels the x-axis on this barplot
|
# notice how seaborn automatically labels the x-axis on this barplot
|
||||||
@ -141,7 +150,7 @@ ggplot(aes(x="age",y="weight"), data=pets) + geom_point() + labs(title="pets")
|
|||||||
url = "https://raw.githubusercontent.com/e99n09/R-notes/master/data/hre.csv"
|
url = "https://raw.githubusercontent.com/e99n09/R-notes/master/data/hre.csv"
|
||||||
r = requests.get(url)
|
r = requests.get(url)
|
||||||
fp = "hre.csv"
|
fp = "hre.csv"
|
||||||
f = open(fp,"wb")
|
f = open(fp, "wb")
|
||||||
f.write(r.text.encode("UTF-8"))
|
f.write(r.text.encode("UTF-8"))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
@ -185,8 +194,9 @@ rx = re.compile(r'\d+$') # match trailing digits
|
|||||||
- http://stackoverflow.com/questions/11860476/how-to-unlist-a-python-list
|
- http://stackoverflow.com/questions/11860476/how-to-unlist-a-python-list
|
||||||
- http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html
|
- http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def extractYear(v):
|
def extractYear(v):
|
||||||
return(pd.Series(reduce(lambda x,y: x+y,map(rx.findall,v),[])).astype(int))
|
return(pd.Series(reduce(lambda x, y: x + y, map(rx.findall, v), [])).astype(int))
|
||||||
|
|
||||||
hre["BirthY"] = extractYear(hre.Birth)
|
hre["BirthY"] = extractYear(hre.Birth)
|
||||||
hre["DeathY"] = extractYear(hre.Death)
|
hre["DeathY"] = extractYear(hre.Death)
|
||||||
@ -199,7 +209,7 @@ sns.lmplot("BirthY", "EstAge", data=hre, hue="Dynasty", fit_reg=False);
|
|||||||
|
|
||||||
# use scipy to run a linear regression
|
# use scipy to run a linear regression
|
||||||
from scipy import stats
|
from scipy import stats
|
||||||
(slope,intercept,rval,pval,stderr)=stats.linregress(hre.BirthY,hre.EstAge)
|
(slope, intercept, rval, pval, stderr) = stats.linregress(hre.BirthY, hre.EstAge)
|
||||||
# code source: http://wiki.scipy.org/Cookbook/LinearRegression
|
# code source: http://wiki.scipy.org/Cookbook/LinearRegression
|
||||||
|
|
||||||
# check the slope
|
# check the slope
|
||||||
@ -223,6 +233,7 @@ sns.lmplot("BirthY", "EstAge", data=hre);
|
|||||||
To see a version of the Holy Roman Emperors analysis using R, see
|
To see a version of the Holy Roman Emperors analysis using R, see
|
||||||
- http://github.com/e99n09/R-notes/blob/master/holy_roman_emperors_dates.R
|
- http://github.com/e99n09/R-notes/blob/master/holy_roman_emperors_dates.R
|
||||||
"""
|
"""
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to learn more, get _Python for Data Analysis_ by Wes McKinney. It's a superb resource and I used it as a reference when writing this tutorial.
|
If you want to learn more, get _Python for Data Analysis_ by Wes McKinney. It's a superb resource and I used it as a reference when writing this tutorial.
|
||||||
|
@ -594,3 +594,4 @@ Something.new.qux # => 'qux'
|
|||||||
- [Ruby from other languages](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/)
|
- [Ruby from other languages](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/)
|
||||||
- [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/) - An older [free edition](http://ruby-doc.com/docs/ProgrammingRuby/) is available online.
|
- [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/) - An older [free edition](http://ruby-doc.com/docs/ProgrammingRuby/) is available online.
|
||||||
- [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide) - A community-driven Ruby coding style guide.
|
- [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide) - A community-driven Ruby coding style guide.
|
||||||
|
- [Try Ruby](http://tryruby.org) - Learn the basic of Ruby programming language, interactive in the browser.
|
||||||
|
@ -327,9 +327,15 @@ divideInts(10, 3) // (Int, Int) = (3,1)
|
|||||||
val d = divideInts(10, 3) // (Int, Int) = (3,1)
|
val d = divideInts(10, 3) // (Int, Int) = (3,1)
|
||||||
|
|
||||||
d._1 // Int = 3
|
d._1 // Int = 3
|
||||||
|
|
||||||
d._2 // Int = 1
|
d._2 // Int = 1
|
||||||
|
|
||||||
|
// Alternatively you can do multiple-variable assignment to tuple, which is more
|
||||||
|
// convenient and readable in many cases
|
||||||
|
val (div, mod) = divideInts(10, 3)
|
||||||
|
|
||||||
|
div // Int = 3
|
||||||
|
mod // Int = 1
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
// 5. Object Oriented Programming
|
// 5. Object Oriented Programming
|
||||||
@ -460,6 +466,9 @@ def matchEverything(obj: Any): String = obj match {
|
|||||||
|
|
||||||
// You can nest patterns:
|
// You can nest patterns:
|
||||||
case List(List((1, 2, "YAY"))) => "Got a list of list of tuple"
|
case List(List((1, 2, "YAY"))) => "Got a list of list of tuple"
|
||||||
|
|
||||||
|
// Match any case (default) if all previous haven't matched
|
||||||
|
case _ => "Got unknown object"
|
||||||
}
|
}
|
||||||
|
|
||||||
// In fact, you can pattern match any object with an "unapply" method. This
|
// In fact, you can pattern match any object with an "unapply" method. This
|
||||||
@ -612,6 +621,9 @@ import scala.collection.immutable.{List => ImmutableList}
|
|||||||
// Import all classes, except some. The following excludes Map and Set:
|
// Import all classes, except some. The following excludes Map and Set:
|
||||||
import scala.collection.immutable.{Map => _, Set => _, _}
|
import scala.collection.immutable.{Map => _, Set => _, _}
|
||||||
|
|
||||||
|
// Java classes can also be imported. Scala syntax can be used
|
||||||
|
import java.swing.{JFrame, JWindow}
|
||||||
|
|
||||||
// Your programs entry point is defined in an scala file using an object, with a
|
// Your programs entry point is defined in an scala file using an object, with a
|
||||||
// single method, main:
|
// single method, main:
|
||||||
object Application {
|
object Application {
|
||||||
|
@ -213,7 +213,7 @@ default: // required (in order to cover all possible input)
|
|||||||
// Functions are a first-class type, meaning they can be nested
|
// Functions are a first-class type, meaning they can be nested
|
||||||
// in functions and can be passed around
|
// in functions and can be passed around
|
||||||
|
|
||||||
// Function with Swift header docs (format as reStructedText)
|
// Function with Swift header docs (format as Swift-modified Markdown syntax)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
A greet operation
|
A greet operation
|
||||||
@ -221,9 +221,9 @@ A greet operation
|
|||||||
- A bullet in docs
|
- A bullet in docs
|
||||||
- Another bullet in the docs
|
- Another bullet in the docs
|
||||||
|
|
||||||
:param: name A name
|
- Parameter name : A name
|
||||||
:param: day A day
|
- Parameter day : A day
|
||||||
:returns: A string containing the name and day value.
|
- Returns : A string containing the name and day value.
|
||||||
*/
|
*/
|
||||||
func greet(name: String, day: String) -> String {
|
func greet(name: String, day: String) -> String {
|
||||||
return "Hello \(name), today is \(day)."
|
return "Hello \(name), today is \(day)."
|
||||||
@ -392,7 +392,7 @@ testTryStuff()
|
|||||||
|
|
||||||
public class Shape {
|
public class Shape {
|
||||||
public func getArea() -> Int {
|
public func getArea() -> Int {
|
||||||
return 0;
|
return 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ filename: LearnTmux.txt
|
|||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
[tmux](http://tmux.sourceforge.net)
|
[tmux](http://tmux.github.io)
|
||||||
is a terminal multiplexer: it enables a number of terminals
|
is a terminal multiplexer: it enables a number of terminals
|
||||||
to be created, accessed, and controlled from a single screen. tmux
|
to be created, accessed, and controlled from a single screen. tmux
|
||||||
may be detached from a screen and continue running in the background
|
may be detached from a screen and continue running in the background
|
||||||
@ -240,7 +240,7 @@ set -g status-right "#[fg=green] | #[fg=white]#(tmux-mem-cpu-load)#[fg=green] |
|
|||||||
|
|
||||||
### References
|
### References
|
||||||
|
|
||||||
[Tmux | Home](http://tmux.sourceforge.net)
|
[Tmux | Home](http://tmux.github.io)
|
||||||
|
|
||||||
[Tmux Manual page](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1?query=tmux)
|
[Tmux Manual page](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1?query=tmux)
|
||||||
|
|
||||||
|
@ -25,14 +25,14 @@ import UIKit
|
|||||||
|
|
||||||
|
|
||||||
//XCode işaretlemelerle kodunuzu bölümlere ayırmanızı ve sağ üstteki metot
|
//XCode işaretlemelerle kodunuzu bölümlere ayırmanızı ve sağ üstteki metot
|
||||||
listesinde gruplama yapmanıza olanak sağlıyor
|
//listesinde gruplama yapmanıza olanak sağlıyor
|
||||||
// MARK: Bölüm işareti
|
// MARK: Bölüm işareti
|
||||||
// TODO: Daha sonra yapılacak
|
// TODO: Daha sonra yapılacak
|
||||||
// FIXME: Bu kodu düzelt
|
// FIXME: Bu kodu düzelt
|
||||||
|
|
||||||
|
|
||||||
//Swift 2 de, println ve print metotları print komutunda birleştirildi. Print
|
//Swift 2 de, println ve print metotları print komutunda birleştirildi.
|
||||||
otomatik olarak yeni satır ekliyor.
|
//Print otomatik olarak yeni satır ekliyor.
|
||||||
print("Merhaba dünya") // println print olarak kullanılıyor.
|
print("Merhaba dünya") // println print olarak kullanılıyor.
|
||||||
print("Merhaba dünya", appendNewLine: false) // yeni bir satır eklemeden yazar.
|
print("Merhaba dünya", appendNewLine: false) // yeni bir satır eklemeden yazar.
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ print("Build degiskeni: \(buildDegiskeni)") // Build degeri: 7
|
|||||||
*/
|
*/
|
||||||
var baziOptionalString: String? = "optional" // nil olabilir.
|
var baziOptionalString: String? = "optional" // nil olabilir.
|
||||||
// yukarıdakiyle aynı ama ? bir postfix (sona eklenir) operatördür. (kolay
|
// yukarıdakiyle aynı ama ? bir postfix (sona eklenir) operatördür. (kolay
|
||||||
okunabilir)
|
//okunabilir)
|
||||||
var someOptionalString2: Optional<String> = "optional"
|
var someOptionalString2: Optional<String> = "optional"
|
||||||
|
|
||||||
|
|
||||||
@ -104,7 +104,8 @@ if let baziOpsiyonelSabitString = baziOptionalString {
|
|||||||
// Swift değişkenlerde herhangi bir tip saklanabilir.
|
// Swift değişkenlerde herhangi bir tip saklanabilir.
|
||||||
// AnyObject == id
|
// AnyObject == id
|
||||||
// Objective-C deki `id` den farklı olarak, AnyObject tüm değişkenlerle
|
// Objective-C deki `id` den farklı olarak, AnyObject tüm değişkenlerle
|
||||||
çalışabilir (Class, Int, struct, etc)
|
//çalışabilir
|
||||||
|
(Class, Int, struct, etc)
|
||||||
var herhangiBirObject: AnyObject = 7
|
var herhangiBirObject: AnyObject = 7
|
||||||
herhangiBirObject = "Değer string olarak değişti, iyi bir yöntem değil ama mümkün"
|
herhangiBirObject = "Değer string olarak değişti, iyi bir yöntem değil ama mümkün"
|
||||||
|
|
||||||
@ -234,7 +235,7 @@ func fiyatlariGetir() -> (Double, Double, Double) {
|
|||||||
let fiyatTuple = fiyatlariGetir()
|
let fiyatTuple = fiyatlariGetir()
|
||||||
let fiyat = fiyatTuple.2 // 3.79
|
let fiyat = fiyatTuple.2 // 3.79
|
||||||
// _ (alt çizgi) kullanımı Tuple degerlerini veya diğer değerleri görmezden
|
// _ (alt çizgi) kullanımı Tuple degerlerini veya diğer değerleri görmezden
|
||||||
gelir
|
//gelir
|
||||||
let (_, fiyat1, _) = fiyatTuple // fiyat1 == 3.69
|
let (_, fiyat1, _) = fiyatTuple // fiyat1 == 3.69
|
||||||
print(fiyat1 == fiyatTuple.1) // true
|
print(fiyat1 == fiyatTuple.1) // true
|
||||||
print("Benzin fiyatı: \(fiyat)")
|
print("Benzin fiyatı: \(fiyat)")
|
||||||
|
@ -159,6 +159,14 @@ var tuple = pairToTuple({ item1:"hello", item2:"world"});
|
|||||||
// Including references to a definition file:
|
// Including references to a definition file:
|
||||||
/// <reference path="jquery.d.ts" />
|
/// <reference path="jquery.d.ts" />
|
||||||
|
|
||||||
|
// Template Strings (strings that use backticks)
|
||||||
|
// String Interpolation with Template Strings
|
||||||
|
var name = 'Tyrone';
|
||||||
|
var greeting = `Hi ${name}, how are you?`
|
||||||
|
// Multiline Strings with Template Strings
|
||||||
|
var multiline = `This is an example
|
||||||
|
of a multiline string`;
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Further Reading
|
## Further Reading
|
||||||
|
@ -210,7 +210,7 @@ f2 = {a = 2, b = 3}
|
|||||||
|
|
||||||
metafraction = {}
|
metafraction = {}
|
||||||
function metafraction.__add(f1, f2)
|
function metafraction.__add(f1, f2)
|
||||||
sum = {}
|
local sum = {}
|
||||||
sum.b = f1.b * f2.b
|
sum.b = f1.b * f2.b
|
||||||
sum.a = f1.a * f2.b + f2.a * f1.b
|
sum.a = f1.a * f2.b + f2.a * f1.b
|
||||||
return sum
|
return sum
|
||||||
@ -273,7 +273,7 @@ eatenBy = myFavs.animal -- 可以工作!感谢元表
|
|||||||
Dog = {} -- 1.
|
Dog = {} -- 1.
|
||||||
|
|
||||||
function Dog:new() -- 2.
|
function Dog:new() -- 2.
|
||||||
newObj = {sound = 'woof'} -- 3.
|
local newObj = {sound = 'woof'} -- 3.
|
||||||
self.__index = self -- 4.
|
self.__index = self -- 4.
|
||||||
return setmetatable(newObj, self) -- 5.
|
return setmetatable(newObj, self) -- 5.
|
||||||
end
|
end
|
||||||
@ -307,7 +307,7 @@ mrDog:makeSound() -- 'I say woof' -- 8.
|
|||||||
LoudDog = Dog:new() -- 1.
|
LoudDog = Dog:new() -- 1.
|
||||||
|
|
||||||
function LoudDog:makeSound()
|
function LoudDog:makeSound()
|
||||||
s = self.sound .. ' ' -- 2.
|
local s = self.sound .. ' ' -- 2.
|
||||||
print(s .. s .. s)
|
print(s .. s .. s)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
253
zh-cn/tmux-cn.html.markdown
Normal file
253
zh-cn/tmux-cn.html.markdown
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
---
|
||||||
|
category: tool
|
||||||
|
tool: tmux
|
||||||
|
filename: LearnTmux-cn.txt
|
||||||
|
contributors:
|
||||||
|
- ["mdln", "https://github.com/mdln"]
|
||||||
|
translators:
|
||||||
|
- ["Arnie97", "https://github.com/Arnie97"]
|
||||||
|
lang: zh-cn
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
[tmux](http://tmux.github.io)是一款终端复用工具。
|
||||||
|
在它的帮助下,你可以在同一个控制台上建立、访问并控制多个终端。
|
||||||
|
你可以断开与一个 tmux 终端的连接,此时程序将在后台运行,
|
||||||
|
当你需要时,可以随时重新连接到这个终端。
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
tmux [command] # 运行一条命令
|
||||||
|
# 如果单独使用 'tmux' 而不指定某个命令,将会建立一个新的会话
|
||||||
|
|
||||||
|
new # 创建一个新的会话
|
||||||
|
-s "Session" # 创建一个会话,并命名为“Session”
|
||||||
|
-n "Window" # 创建一个窗口,并命名为“Window”
|
||||||
|
-c "/dir" # 在指定的工作目录中启动会话
|
||||||
|
|
||||||
|
attach # 连接到上一次的会话(如果可用)
|
||||||
|
-t "#" # 连接到指定的会话
|
||||||
|
-d # 断开其他客户端的会话
|
||||||
|
|
||||||
|
ls # 列出打开的会话
|
||||||
|
-a # 列出所有打开的会话
|
||||||
|
|
||||||
|
lsw # 列出窗口
|
||||||
|
-a # 列出所有窗口
|
||||||
|
-s # 列出会话中的所有窗口
|
||||||
|
|
||||||
|
lsp # 列出窗格
|
||||||
|
-a # 列出所有窗格
|
||||||
|
-s # 列出会话中的所有窗格
|
||||||
|
-t "#" # 列出指定窗口中的所有窗格
|
||||||
|
|
||||||
|
kill-window # 关闭当前窗口
|
||||||
|
-t "#" # 关闭指定的窗口
|
||||||
|
-a # 关闭所有窗口
|
||||||
|
-a -t "#" # 关闭除指定窗口以外的所有窗口
|
||||||
|
|
||||||
|
kill-session # 关闭当前会话
|
||||||
|
-t "#" # 关闭指定的会话
|
||||||
|
-a # 关闭所有会话
|
||||||
|
-a -t "#" # 关闭除指定会话以外的所有会话
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 快捷键
|
||||||
|
|
||||||
|
通过“前缀”快捷键,可以控制一个已经连入的 tmux 会话。
|
||||||
|
|
||||||
|
```
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
(C-b) = Ctrl + b # 在使用下列快捷键之前,需要按这个“前缀”快捷键
|
||||||
|
|
||||||
|
(M-1) = Meta + 1 或 Alt + 1
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
? # 列出所有快捷键
|
||||||
|
: # 进入 tmux 的命令提示符
|
||||||
|
r # 强制重绘当前客户端
|
||||||
|
c # 创建一个新窗口
|
||||||
|
|
||||||
|
! # 将当前窗格从窗口中移出,成为为一个新的窗口
|
||||||
|
% # 将当前窗格分为左右两半
|
||||||
|
" # 将当前窗格分为上下两半
|
||||||
|
|
||||||
|
n # 切换到下一个窗口
|
||||||
|
p # 切换到上一个窗口
|
||||||
|
{ # 将当前窗格与上一个窗格交换
|
||||||
|
} # 将当前窗格与下一个窗格交换
|
||||||
|
|
||||||
|
s # 在交互式界面中,选择并连接至另一个会话
|
||||||
|
w # 在交互式界面中,选择并激活一个窗口
|
||||||
|
0 至 9 # 选择 0 到 9 号窗口
|
||||||
|
|
||||||
|
d # 断开当前客户端
|
||||||
|
D # 选择并断开一个客户端
|
||||||
|
|
||||||
|
& # 关闭当前窗口
|
||||||
|
x # 关闭当前窗格
|
||||||
|
|
||||||
|
Up, Down # 将焦点移动至相邻的窗格
|
||||||
|
Left, Right
|
||||||
|
|
||||||
|
M-1 到 M-5 # 排列窗格:
|
||||||
|
# 1) 水平等分
|
||||||
|
# 2) 垂直等分
|
||||||
|
# 3) 将一个窗格作为主要窗格,其他窗格水平等分
|
||||||
|
# 4) 将一个窗格作为主要窗格,其他窗格垂直等分
|
||||||
|
# 5) 平铺
|
||||||
|
|
||||||
|
C-Up, C-Down # 改变当前窗格的大小,每按一次增减一个单位
|
||||||
|
C-Left, C-Right
|
||||||
|
|
||||||
|
M-Up, M-Down # 改变当前窗格的大小,每按一次增减五个单位
|
||||||
|
M-Left, M-Right
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 配置 ~/.tmux.conf
|
||||||
|
|
||||||
|
tmux.conf 可以在 tmux 启动时自动设置选项,类似于 .vimrc 或 init.el 的用法。
|
||||||
|
|
||||||
|
```
|
||||||
|
# tmux.conf 示例
|
||||||
|
# 2014.10
|
||||||
|
|
||||||
|
|
||||||
|
### 通用设置
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# 启用 UTF-8 编码
|
||||||
|
setw -g utf8 on
|
||||||
|
set-option -g status-utf8 on
|
||||||
|
|
||||||
|
# 命令回滚/历史数量限制
|
||||||
|
set -g history-limit 2048
|
||||||
|
|
||||||
|
# 从 1 开始编号,而不是从 0 开始
|
||||||
|
set -g base-index 1
|
||||||
|
|
||||||
|
# 启用鼠标
|
||||||
|
set-option -g mouse-select-pane on
|
||||||
|
|
||||||
|
# 重新加载配置文件
|
||||||
|
unbind r
|
||||||
|
bind r source-file ~/.tmux.conf
|
||||||
|
|
||||||
|
|
||||||
|
### 快捷键设置
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# 取消默认的前缀键 C-b
|
||||||
|
unbind C-b
|
||||||
|
|
||||||
|
# 设置新的前缀键 `
|
||||||
|
set-option -g prefix `
|
||||||
|
|
||||||
|
# 多次按下前缀键时,切换到上一个窗口
|
||||||
|
bind C-a last-window
|
||||||
|
bind ` last-window
|
||||||
|
|
||||||
|
# 按下F11/F12,可以选择不同的前缀键
|
||||||
|
bind F11 set-option -g prefix C-a
|
||||||
|
bind F12 set-option -g prefix `
|
||||||
|
|
||||||
|
# Vim 风格的快捷键绑定
|
||||||
|
setw -g mode-keys vi
|
||||||
|
set-option -g status-keys vi
|
||||||
|
|
||||||
|
# 使用 Vim 风格的按键在窗格间移动
|
||||||
|
bind h select-pane -L
|
||||||
|
bind j select-pane -D
|
||||||
|
bind k select-pane -U
|
||||||
|
bind l select-pane -R
|
||||||
|
|
||||||
|
# 循环切换不同的窗口
|
||||||
|
bind e previous-window
|
||||||
|
bind f next-window
|
||||||
|
bind E swap-window -t -1
|
||||||
|
bind F swap-window -t +1
|
||||||
|
|
||||||
|
# 较易于使用的窗格分割快捷键
|
||||||
|
bind = split-window -h
|
||||||
|
bind - split-window -v
|
||||||
|
unbind '"'
|
||||||
|
unbind %
|
||||||
|
|
||||||
|
# 在嵌套使用 tmux 的情况下,激活最内层的会话,以便向其发送命令
|
||||||
|
bind a send-prefix
|
||||||
|
|
||||||
|
|
||||||
|
### 外观主题
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# 状态栏颜色
|
||||||
|
set-option -g status-justify left
|
||||||
|
set-option -g status-bg black
|
||||||
|
set-option -g status-fg white
|
||||||
|
set-option -g status-left-length 40
|
||||||
|
set-option -g status-right-length 80
|
||||||
|
|
||||||
|
# 窗格边框颜色
|
||||||
|
set-option -g pane-active-border-fg green
|
||||||
|
set-option -g pane-active-border-bg black
|
||||||
|
set-option -g pane-border-fg white
|
||||||
|
set-option -g pane-border-bg black
|
||||||
|
|
||||||
|
# 消息框颜色
|
||||||
|
set-option -g message-fg black
|
||||||
|
set-option -g message-bg green
|
||||||
|
|
||||||
|
# 窗口状态栏颜色
|
||||||
|
setw -g window-status-bg black
|
||||||
|
setw -g window-status-current-fg green
|
||||||
|
setw -g window-status-bell-attr default
|
||||||
|
setw -g window-status-bell-fg red
|
||||||
|
setw -g window-status-content-attr default
|
||||||
|
setw -g window-status-content-fg yellow
|
||||||
|
setw -g window-status-activity-attr default
|
||||||
|
setw -g window-status-activity-fg yellow
|
||||||
|
|
||||||
|
|
||||||
|
### 用户界面
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# 通知方式
|
||||||
|
setw -g monitor-activity on
|
||||||
|
set -g visual-activity on
|
||||||
|
set-option -g bell-action any
|
||||||
|
set-option -g visual-bell off
|
||||||
|
|
||||||
|
# 自动设置窗口标题
|
||||||
|
set-option -g set-titles on
|
||||||
|
set-option -g set-titles-string '#H:#S.#I.#P #W #T' # 窗口编号,程序名称,是否活动
|
||||||
|
|
||||||
|
# 调整状态栏
|
||||||
|
set -g status-left "#[fg=red] #H#[fg=green]:#[fg=white]#S#[fg=green] |#[default]"
|
||||||
|
|
||||||
|
# 在状态栏中显示性能计数器
|
||||||
|
# 需要用到 https://github.com/thewtex/tmux-mem-cpu-load
|
||||||
|
set -g status-interval 4
|
||||||
|
set -g status-right "#[fg=green] | #[fg=white]#(tmux-mem-cpu-load)#[fg=green] | #[fg=cyan]%H:%M #[default]"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 参考资料
|
||||||
|
|
||||||
|
[Tmux 主页](http://tmux.github.io)
|
||||||
|
|
||||||
|
[Tmux 手册](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1?query=tmux)
|
||||||
|
|
||||||
|
[FreeBSDChina Wiki](https://wiki.freebsdchina.org/software/t/tmux)
|
||||||
|
|
||||||
|
[Archlinux Wiki](https://wiki.archlinux.org/index.php/Tmux_(简体中文))
|
||||||
|
|
||||||
|
[Tmux 快速教程](http://blog.jeswang.org/blog/2013/06/24/tmux-kuai-su-jiao-cheng)
|
||||||
|
|
||||||
|
[如何在 tmux 状态栏中显示 CPU / 内存占用的百分比](https://stackoverflow.com/questions/11558907/is-there-a-better-way-to-display-cpu-usage-in-tmux)
|
||||||
|
|
||||||
|
[管理复杂 tmux 会话的工具 - tmuxinator](https://github.com/tmuxinator/tmuxinator)
|
727
zh-tw/python-tw.html.markdown
Normal file
727
zh-tw/python-tw.html.markdown
Normal file
@ -0,0 +1,727 @@
|
|||||||
|
---
|
||||||
|
language: python
|
||||||
|
contributors:
|
||||||
|
- ["Louie Dinh", "http://ldinh.ca"]
|
||||||
|
- ["Amin Bandali", "http://aminbandali.com"]
|
||||||
|
- ["Andre Polykanine", "https://github.com/Oire"]
|
||||||
|
- ["evuez", "http://github.com/evuez"]
|
||||||
|
translators:
|
||||||
|
- ["Michael Yeh", "https://hinet60613.github.io/"]
|
||||||
|
filename: learnpython-tw.py
|
||||||
|
lang: zh-tw
|
||||||
|
---
|
||||||
|
|
||||||
|
Python是在1990年代早期由Guido Van Rossum創建的。它是現在最流行的程式語言之一。我愛上Python是因為他極為清晰的語法,甚至可以說它就是可執行的虛擬碼。
|
||||||
|
|
||||||
|
非常歡迎各位給我們任何回饋! 你可以在[@louiedinh](http://twitter.com/louiedinh) 或 louiedinh [at] [google's email service]聯絡到我。
|
||||||
|
|
||||||
|
註: 本篇文章適用的版本為Python 2.7,但大部分的Python 2.X版本應該都適用。 Python 2.7將會在2020年停止維護,因此建議您可以從Python 3開始學Python。
|
||||||
|
Python 3.X可以看這篇[Python 3 教學 (英文)](http://learnxinyminutes.com/docs/python3/).
|
||||||
|
|
||||||
|
讓程式碼同時支援Python 2.7和3.X是可以做到的,只要引入
|
||||||
|
[`__future__` imports](https://docs.python.org/2/library/__future__.html) 模組.
|
||||||
|
`__future__` 模組允許你撰寫可以在Python 2上執行的Python 3程式碼,詳細訊息請參考Python 3 教學。
|
||||||
|
|
||||||
|
```python
|
||||||
|
|
||||||
|
# 單行註解從井字號開始
|
||||||
|
|
||||||
|
""" 多行字串可以用三個雙引號
|
||||||
|
包住,不過通常這種寫法會
|
||||||
|
被拿來當作多行註解
|
||||||
|
"""
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 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
|
||||||
|
|
||||||
|
# 指數 (x的y次方)
|
||||||
|
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
|
||||||
|
|
||||||
|
# 字串用單引號 ' 或雙引號 " 建立
|
||||||
|
"This is a string."
|
||||||
|
'This is also a string.'
|
||||||
|
|
||||||
|
# 字串相加會被串接再一起
|
||||||
|
"Hello " + "world!" # => "Hello world!"
|
||||||
|
# 不用加號也可以做字串相加
|
||||||
|
"Hello " "world!" # => "Hello world!"
|
||||||
|
|
||||||
|
# ... 也可以做相乘
|
||||||
|
"Hello" * 3 # => "HelloHelloHello"
|
||||||
|
|
||||||
|
# 字串可以被視為字元的陣列
|
||||||
|
"This is a string"[0] # => 'T'
|
||||||
|
|
||||||
|
# 字串的格式化可以用百分之符號 %
|
||||||
|
# 儘管在Python 3.1後這個功能被廢棄了,並且在
|
||||||
|
# 之後的版本會被移除,但還是可以了解一下
|
||||||
|
x = 'apple'
|
||||||
|
y = 'lemon'
|
||||||
|
z = "The items in the basket are %s and %s" % (x,y)
|
||||||
|
|
||||||
|
# 新的格式化方式是使用format函式
|
||||||
|
# 這個方式也是較為推薦的
|
||||||
|
"{} is a {}".format("This", "placeholder")
|
||||||
|
"{0} can be {1}".format("strings", "formatted")
|
||||||
|
# 你也可以用關鍵字,如果你不想數你是要用第幾個變數的話
|
||||||
|
"{name} wants to eat {food}".format(name="Bob", food="lasagna")
|
||||||
|
|
||||||
|
# 無(None) 是一個物件
|
||||||
|
None # => None
|
||||||
|
|
||||||
|
# 不要用等於符號 "==" 對 無(None)做比較
|
||||||
|
# 用 "is"
|
||||||
|
"etc" is None # => False
|
||||||
|
None is None # => True
|
||||||
|
|
||||||
|
# 'is' 運算元是用來識別物件的。對原始型別來說或許沒什麼用,
|
||||||
|
# 但對物件來說是很有用的。
|
||||||
|
|
||||||
|
# 任何物件都可以被當作布林值使用
|
||||||
|
# 以下的值會被視為是False :
|
||||||
|
# - 無(None)
|
||||||
|
# - 任何型別的零 (例如: 0, 0L, 0.0, 0j)
|
||||||
|
# - 空序列 (例如: '', (), [])
|
||||||
|
# - 空容器 (例如: {}, set())
|
||||||
|
# - 自定義型別的實體,且滿足某些條件
|
||||||
|
# 請參考文件: https://docs.python.org/2/reference/datamodel.html#object.__nonzero__
|
||||||
|
#
|
||||||
|
# 其餘的值都會被視為True (用bool()函式讓他們回傳布林值).
|
||||||
|
bool(0) # => False
|
||||||
|
bool("") # => False
|
||||||
|
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 2. 變數與集合
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# Python的輸出很方便
|
||||||
|
print "I'm Python. Nice to meet you!" # => I'm Python. Nice to meet you!
|
||||||
|
|
||||||
|
# 從命令列獲得值也很方便
|
||||||
|
input_string_var = raw_input("Enter some data: ") # 資料會被視為字串存進變數
|
||||||
|
input_var = input("Enter some data: ") # 輸入的資料會被當作Python程式碼執行
|
||||||
|
# 注意: 請謹慎使用input()函式
|
||||||
|
# 註: 在Python 3中,input()已被棄用,raw_input()已被更名為input()
|
||||||
|
|
||||||
|
# 使用變數前不需要先宣告
|
||||||
|
some_var = 5 # 方便好用
|
||||||
|
lower_case_with_underscores
|
||||||
|
some_var # => 5
|
||||||
|
|
||||||
|
# 對沒有被賦值的變數取值會造成例外
|
||||||
|
# 請參考錯誤流程部分做例外處理
|
||||||
|
some_other_var # 造成 NameError
|
||||||
|
|
||||||
|
# if可以當判斷式使用
|
||||||
|
# 相當於C語言中的二元判斷式
|
||||||
|
"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 # 註: 將其設定回原本的值
|
||||||
|
# 用 -1 索引值查看串列最後一個元素
|
||||||
|
li[-1] # => 3
|
||||||
|
|
||||||
|
# 存取超過範圍會產生IndexError
|
||||||
|
li[4] # Raises an IndexError
|
||||||
|
|
||||||
|
# 你可以用切片語法來存取特定範圍的值
|
||||||
|
# (相當於數學中的左閉右開區間,即包含最左邊界,但不包含右邊界)
|
||||||
|
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) # 2 不在串列中,造成 ValueError
|
||||||
|
|
||||||
|
# 在特定位置插入值
|
||||||
|
li.insert(1, 2) # 現在 li 內容再次回復為 [1, 2, 3, 4, 5, 6]
|
||||||
|
|
||||||
|
# 取得特定值在串列中第一次出現的位置
|
||||||
|
li.index(2) # => 1
|
||||||
|
li.index(7) # 7 不在串列中,造成 ValueError
|
||||||
|
|
||||||
|
# 用 "in" 檢查特定值是否出現在串列中
|
||||||
|
1 in li # => True
|
||||||
|
|
||||||
|
# 用 "len()" 取得串列長度
|
||||||
|
len(li) # => 6
|
||||||
|
|
||||||
|
|
||||||
|
# 元組(Tuple,以下仍用原文)類似於串列,但是它是不可改變的
|
||||||
|
tup = (1, 2, 3)
|
||||||
|
tup[0] # => 1
|
||||||
|
tup[0] = 3 # 產生TypeError
|
||||||
|
|
||||||
|
# 能對串列做的東西都可以對tuple做
|
||||||
|
len(tup) # => 3
|
||||||
|
tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6)
|
||||||
|
tup[:2] # => (1, 2)
|
||||||
|
2 in tup # => True
|
||||||
|
|
||||||
|
# 你可以把tuple拆開並分別將值存入不同變數
|
||||||
|
a, b, c = (1, 2, 3) # a 現在是 1, b 現在是 2, c 現在是 3
|
||||||
|
d, e, f = 4, 5, 6 # 也可以不寫括號
|
||||||
|
# 如果不加括號,預設會產生tuple
|
||||||
|
g = 4, 5, 6 # => (4, 5, 6)
|
||||||
|
# 你看,交換兩個值很簡單吧
|
||||||
|
e, d = d, e # 此時 d 的值為 5 且 e 的值為 4
|
||||||
|
|
||||||
|
|
||||||
|
# 字典(Dictionary)用來儲存映射關係
|
||||||
|
empty_dict = {}
|
||||||
|
# 你可以對字典做初始化
|
||||||
|
filled_dict = {"one": 1, "two": 2, "three": 3}
|
||||||
|
|
||||||
|
# 用 [] 取值
|
||||||
|
filled_dict["one"] # => 1
|
||||||
|
|
||||||
|
# 用 "keys()" 將所有的Key輸出到一個List中
|
||||||
|
filled_dict.keys() # => ["three", "two", "one"]
|
||||||
|
# 註: 字典裡key的排序是不固定的
|
||||||
|
# 你的執行結果可能與上面不同
|
||||||
|
# 譯註: 只能保證所有的key都有出現,但不保證順序
|
||||||
|
|
||||||
|
# 用 "values()" 將所有的Value輸出到一個List中
|
||||||
|
filled_dict.values() # => [3, 2, 1]
|
||||||
|
# 註: 同上,不保證順序
|
||||||
|
|
||||||
|
# 用 "in" 來檢查指定的Key是否在字典中
|
||||||
|
"one" in filled_dict # => True
|
||||||
|
1 in filled_dict # => False
|
||||||
|
|
||||||
|
# 查詢不存在的Key會造成KeyError
|
||||||
|
filled_dict["four"] # KeyError
|
||||||
|
|
||||||
|
# 用 "get()" 來避免KeyError
|
||||||
|
# 若指定的Key不存在的話會得到None
|
||||||
|
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()此時並沒有產生出任何的值)
|
||||||
|
|
||||||
|
# 像操作list一樣,對指定的Key賦值
|
||||||
|
filled_dict["four"] = 4 # 此時 filled_dict["four"] => 4
|
||||||
|
|
||||||
|
# "setdefault()" 只在指定的Key不存在時才會將值插入dictionary
|
||||||
|
filled_dict.setdefault("five", 5) # filled_dict["five"] 被指定為 5
|
||||||
|
filled_dict.setdefault("five", 6) # filled_dict["five"] 仍保持 5
|
||||||
|
|
||||||
|
|
||||||
|
# 集合(Set)被用來儲存...集合。
|
||||||
|
# 跟串列(List)有點像,但集合內不會有重複的元素
|
||||||
|
empty_set = 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 開始,可以使用大括號 {} 來宣告Set
|
||||||
|
filled_set = {1, 2, 2, 3, 4} # => {1, 2, 3, 4}
|
||||||
|
|
||||||
|
# 加入更多元素進入Set
|
||||||
|
filled_set.add(5) # filled_set is now {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 is smaller than 10"
|
||||||
|
if some_var > 10:
|
||||||
|
print "some_var is totally bigger than 10."
|
||||||
|
elif some_var < 10: # elif 可有可無
|
||||||
|
print "some_var is smaller than 10."
|
||||||
|
else: # else 也可有可無
|
||||||
|
print "some_var is indeed 10."
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
For 迴圈會遞迴整的List
|
||||||
|
下面的程式碼會輸出:
|
||||||
|
dog is a mammal
|
||||||
|
cat is a mammal
|
||||||
|
mouse is a mammal
|
||||||
|
"""
|
||||||
|
for animal in ["dog", "cat", "mouse"]:
|
||||||
|
# 你可以用{0}來組合0出格式化字串 (見上面.)
|
||||||
|
print "{0} is a mammal".format(animal)
|
||||||
|
|
||||||
|
"""
|
||||||
|
"range(number)" 回傳一個包含從0到給定值的數字List,
|
||||||
|
下面的程式碼會輸出:
|
||||||
|
0
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
"""
|
||||||
|
for i in range(4):
|
||||||
|
print i
|
||||||
|
|
||||||
|
"""
|
||||||
|
"range(lower, upper)" 回傳一個包含從給定的下限
|
||||||
|
到給定的上限的數字List
|
||||||
|
下面的程式碼會輸出:
|
||||||
|
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("This is an index error")
|
||||||
|
except IndexError as e:
|
||||||
|
pass # 毫無反應,就只是個什麼都沒做的pass。通常這邊會讓你做對例外的處理
|
||||||
|
except (TypeError, NameError):
|
||||||
|
pass # 有需要的話,多種例外可以一起處理
|
||||||
|
else: # else 可有可無,但必須寫在所有的except後
|
||||||
|
print "All good!" # 只有在try的時候沒有產生任何except才會被執行
|
||||||
|
finally: # 不管什麼情況下一定會被執行
|
||||||
|
print "We can clean up resources here"
|
||||||
|
|
||||||
|
# 除了try/finally以外,你可以用 with 來簡單的處理清理動作
|
||||||
|
with open("myfile.txt") as f:
|
||||||
|
for line in f:
|
||||||
|
print line
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 4. 函式
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# 用 "def" 來建立新函式
|
||||||
|
def add(x, y):
|
||||||
|
print "x is {0} and y is {1}".format(x, y)
|
||||||
|
return x + y # 用 "return" 來回傳值
|
||||||
|
|
||||||
|
# 用參數來呼叫函式
|
||||||
|
add(5, 6) # => 輸出 "x is 5 and y is 6" 並回傳 11
|
||||||
|
|
||||||
|
# 你也可以寫上參數名稱來呼叫函式
|
||||||
|
add(y=6, x=5) # 這種狀況下,兩個參數的順序並不影響執行
|
||||||
|
|
||||||
|
|
||||||
|
# 你可以定義接受多個變數的函式,用*來表示參數tuple
|
||||||
|
def varargs(*args):
|
||||||
|
return args
|
||||||
|
|
||||||
|
varargs(1, 2, 3) # => (1, 2, 3)
|
||||||
|
|
||||||
|
|
||||||
|
# 你可以定義接受多個變數的函式,用**來表示參數dictionary
|
||||||
|
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) prints:
|
||||||
|
(1, 2)
|
||||||
|
{"a": 3, "b": 4}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 呼叫函式時,你可以做反向的操作
|
||||||
|
# 用 * 將變數展開為順序排序的變數
|
||||||
|
# 用 ** 將變數展開為Keyword排序的變數
|
||||||
|
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)
|
||||||
|
|
||||||
|
# 你可以把args跟kwargs傳到下一個函式內
|
||||||
|
# 分別用 * 跟 ** 將它展開就可以了
|
||||||
|
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 在set_global_x(6)被設定為 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]
|
||||||
|
|
||||||
|
# 我們可以用List列表的方式對map和filter等高階函式做更有趣的應用
|
||||||
|
[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. 類別
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# 我們可以由object繼承出一個新的類別
|
||||||
|
class Human(object):
|
||||||
|
|
||||||
|
# 類別的參數,被所有這個類別的實體所共用
|
||||||
|
species = "H. sapiens"
|
||||||
|
|
||||||
|
# 基礎建構函式,當class被實體化的時候會被呼叫
|
||||||
|
# 注意前後的雙底線
|
||||||
|
# 代表此物件或屬性雖然在使用者控制的命名空間內,但是被python使用
|
||||||
|
def __init__(self, name):
|
||||||
|
# 將函式引入的參數 name 指定給實體的 name 參數
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
# 初始化屬性
|
||||||
|
self.age = 0
|
||||||
|
|
||||||
|
|
||||||
|
# 一個實體的方法(method)。 所有的method都以self為第一個參數
|
||||||
|
def say(self, msg):
|
||||||
|
return "{0}: {1}".format(self.name, msg)
|
||||||
|
|
||||||
|
# 一個類別方法會被所有的實體所共用
|
||||||
|
# 他們會以類別為第一參數的方式被呼叫
|
||||||
|
@classmethod
|
||||||
|
def get_species(cls):
|
||||||
|
return cls.species
|
||||||
|
|
||||||
|
# 靜態方法
|
||||||
|
@staticmethod
|
||||||
|
def grunt():
|
||||||
|
return "*grunt*"
|
||||||
|
|
||||||
|
# 屬性就像是用getter取值一樣
|
||||||
|
# 它將方法 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="Ian")
|
||||||
|
print i.say("hi") # prints out "Ian: hi"
|
||||||
|
|
||||||
|
j = Human("Joel")
|
||||||
|
print j.say("hello") # prints out "Joel: hello"
|
||||||
|
|
||||||
|
# 呼叫類別方法
|
||||||
|
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 # => raises an AttributeError
|
||||||
|
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 6. 模組
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# 你可以引入模組來做使用
|
||||||
|
import math
|
||||||
|
print math.sqrt(16) # => 4
|
||||||
|
# math.sqrt()為取根號
|
||||||
|
|
||||||
|
# 你可以只從模組取出特定幾個函式
|
||||||
|
from math import ceil, floor
|
||||||
|
print ceil(3.7) # => 4.0
|
||||||
|
print floor(3.7) # => 3.0
|
||||||
|
|
||||||
|
# 你可以將所有的函式從模組中引入
|
||||||
|
# 注意:不建議這麼做
|
||||||
|
from math import *
|
||||||
|
|
||||||
|
# 你可以用 as 簡寫模組名稱
|
||||||
|
import math as m
|
||||||
|
math.sqrt(16) == m.sqrt(16) # => True
|
||||||
|
# 你也可以測試函示是否相等
|
||||||
|
from math import sqrt
|
||||||
|
math.sqrt == m.sqrt == sqrt # => True
|
||||||
|
|
||||||
|
# Python的模組就只是一般的Python檔。
|
||||||
|
# 你可以自己的模組自己寫、自己的模組自己引入
|
||||||
|
# 模組的名稱和檔案名稱一樣
|
||||||
|
|
||||||
|
# 你可以用dir()來查看有哪些可用函式和屬性
|
||||||
|
import math
|
||||||
|
dir(math)
|
||||||
|
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
## 7. 進階
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
# 產生器(Generator)可以讓你寫更懶惰的程式碼
|
||||||
|
def double_numbers(iterable):
|
||||||
|
for i in iterable:
|
||||||
|
yield i + i
|
||||||
|
|
||||||
|
# 產生器可以讓你即時的產生值
|
||||||
|
# 不是全部產生完之後再一次回傳,產生器會在每一個遞迴時
|
||||||
|
# 產生值。 這也意味著大於15的值不會在double_numbers中產生。
|
||||||
|
# 這邊,xrange()做的事情和range()一樣
|
||||||
|
# 建立一個 1-900000000 的List會消耗很多時間和記憶體空間
|
||||||
|
# xrange() 建立一個產生器物件,而不是如range()建立整個List
|
||||||
|
# 我們用底線來避免可能和python的關鍵字重複的名稱
|
||||||
|
xrange_ = xrange(1, 900000000)
|
||||||
|
|
||||||
|
# 下面的程式碼會把所有的值乘以兩倍,直到出現大於30的值
|
||||||
|
for i in double_numbers(xrange_):
|
||||||
|
print i
|
||||||
|
if i >= 30:
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
# 裝飾子
|
||||||
|
# 在這個範例中,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, "Please! I am poor :(")
|
||||||
|
return msg
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
@beg
|
||||||
|
def say(say_please=False):
|
||||||
|
msg = "Can you buy me a beer?"
|
||||||
|
return msg, say_please
|
||||||
|
|
||||||
|
|
||||||
|
print say() # Can you buy me a beer?
|
||||||
|
print say(say_please=True) # Can you buy me a beer? Please! I am poor :(
|
||||||
|
```
|
||||||
|
|
||||||
|
## 準備好學更多了嗎?
|
||||||
|
|
||||||
|
### 線上免費資源
|
||||||
|
|
||||||
|
* [Automate the Boring Stuff with Python](https://automatetheboringstuff.com)
|
||||||
|
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
|
||||||
|
* [Dive Into Python](http://www.diveintopython.net/)
|
||||||
|
* [The Official Docs](http://docs.python.org/2/)
|
||||||
|
* [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)
|
||||||
|
* [First Steps With Python](https://realpython.com/learn/python-first-steps/)
|
||||||
|
|
||||||
|
### 或買本書?
|
||||||
|
|
||||||
|
* [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)
|
Loading…
Reference in New Issue
Block a user