Freecodecamp: Futur Curriculum Python [Discussion]

Créé le 25 avr. 2017  ·  56Commentaires  ·  Source: freeCodeCamp/freeCodeCamp

Curriculum Python

Ce numéro sera le fil conducteur de la planification et du développement du futur programme FCC Python.

Pour toute discussion sur l'intégration de REPL.it Classroom, veuillez visiter https://github.com/freeCodeCamp/freeCodeCamp/issues/14736 à la place

Nous travaillons actuellement sur l'exécution d'une suite de tests Python vérifiable sur un widget iframe Repl.it. Une fois que cela fonctionne, nous commencerons à implémenter le programme défini dans ce fil. Si vous souhaitez développer cette partie du programme FCC Python, veuillez m'envoyer un message (Ethan Arrowood) sur Gitter ou commenter ci-dessous.

Veuillez noter pour écrire tous les défis Python dans la version 3.6



La structure actuelle du programme FCC Python est la suivante: section débutant, section intermédiaire et section thématique spéciale.

Section débutant:

  • [] Introduction à Python
  • [ ] Production

    • Impression

    • Personnages de fuite

    • contribution

  • [ ] Types de données

    • Entiers, flottants

    • Cordes

    • Tuples

    • Listes

    • Ensembles

    • Dictionnaires

  • [ ] Les opérateurs

    • +, -,, /,%, *

    • <,>, <=,> =, ==,! =

    • =

    • Vrai, faux et ou non

    • dans, pas dans

    • est, n'est pas

  • [x] Mathématiques - @bgroveben

    • Ajouter, soustraire, multiplier, diviser

    • Puissance, sqrt (), abs (), round (), sum (), max (), min ()

  • [] Variables
  • [] Conditions

    • si, elif, sinon

  • [ ] Boucles

    • tandis que, pour (dans la plage), pour (dans la liste), pour (dans la chaîne)

  • [ ] Les fonctions
  • [ ] Des classes

Section intermédiaire:

  • [] E / S de fichier
  • [] Itérateurs et générateurs
  • [x] Lambda - @robbiemu
  • [] Conditions
  • [] POO
  • [] Modules, bibliothèques, packages
  • [] Gestion des fichiers et des erreurs
  • [] Objets avancés et types de données
  • [] Formatage d'impression
  • [] Liste des compréhensions
  • [] Décorateurs

Section de sujet spécial:

  • [] Apprentissage automatique
  • [ ] Développement de jeu
  • [] Webscraping (BeautifulSoup)
  • [] SIG (Brochure / Folium)
  • [] Flask / Django (mieux vaut se concentrer sur un pas sur les deux)
  • [] Analyse des données (Panda / Numpy)
  • [] Visualisation des données (cassé)
  • [] GUI (tkinter)
  • [] Géocodage (geopy)
  • [] Boîte à outils en langage naturel (NLTK)

Vous avez une idée pour une leçon de section?

Commentez ci-dessous et veuillez préciser à quelle section il doit être ajouté et pourquoi.

Vous souhaitez développer le programme d'une leçon?

Commentez ci-dessous les détails suivants:

  • Titre
  • Description / Explication / Leçon
  • Invite de code / défi
  • Code prédéfini
  • Solution
  • Des tests

Vous souhaitez apporter des modifications à une leçon existante?

Fournissez à vos mises à jour des explications détaillées sur les raisons pour lesquelles vous apportez les modifications données.



Bientôt disponible

-

Comment proposer un défi Python

https://github.com/freeCodeCamp/freeCodeCamp/tree/feature/python-challenges

Proposer un défi Python?

learn

Commentaire le plus utile

Salut les gars, je suis le fondateur / PDG de Repl.it. FAC nous tient à cœur et nous ferons tout ce que nous pouvons pour pouvoir apporter notre soutien ici. Quels sont les principaux obstacles à l'adoption des salles de classe Repl.it pour cela?

Tous les 56 commentaires

Voici ce que nous pouvons ajouter:
Débutant

  • Conditionnels

Intermédiaire:

  • Itérateurs et générateurs
  • Lambda
  • Conditionnels
  • POO
  • Modules, bibliothèques, packages
  • Gestion des fichiers et des erreurs
  • Objets avancés et types de données
  • Format d'impression

Avancée:

  • Webscraping (BeautifulSoup)
  • SIG (Brochure / Folium)
  • Flask / Django (je pencherais davantage vers Django)
  • Analyse des données (Panda / Numpy)
  • Visualisation des données (fauché)
  • GUI (tkinter)
  • Géocodage (geopy)

@mstellaluna Merci pour vos recommandations. Quelle serait la différence entre la section conditionnelle débutant et la section conditionnelle intermédiaire?

@ Ethan-Arrowood pour moi, les bases devraient être simplement les connaissances minimales (si, sinon, pour, lesquelles). Mon entrée pour le "conditionnel" dans l'intermédiaire serait des conditionnelles basées sur l'entrée utilisateur ou des instructions ternaires .. même chose pour le formatage d'impression .. de base serait une simple instruction d'impression alors que l'intermédiaire nous pouvons introduire des instructions d'impression avec des variables, les% s. . etc

Repl.it a un nouvel espace pour créer des salles de classe personnalisées. Vous pouvez créer des affectations avec des instructions.

Salles de classe Repl.it
https://repl.it/site/classrooms

Liste des classes communautaires
https://repl.it/community

Je suggère d'ajouter des sections d'algorithmes de base, intermédiaires et avancés (similaires à ce que le programme FCC Front End a pour JavaScript).

J'ai regardé l'exemple FCC-Python-Variable-Challenge donné, et j'ai remarqué que le défi attend un peu de connaissances sur les «prérequis». Comme si le campeur avait déjà été initié aux variables.

La description / explication du défi de variable n'explique pas ce que sont les variables. Contrairement au défi Déclarer les variables JavaScript de JavaScript , qui constitue une petite introduction sur ce que sont les variables.

Je sais que ce n'est qu'un exemple - mais juste pour être sûr - allons-nous supposer que le campeur a déjà suivi le programme JavaScript lors de la construction du programme Python?

@jamesperrin Oui, nous avons examiné cela, mais nous essayons de garder l'utilisateur sur le site de FCC afin que les défis soient intégrés. De plus, nous n'avons aucun moyen d'accéder aux résultats des tests unitaires des salles de classe Repl.

@ U-way Ouais c'était mon erreur. L'objectif est que ce programme soit un programme indépendant afin que les explications réelles soient beaucoup plus détaillées (comme la version JS). Merci d'avoir souligné ceci :)

@AnikaErceg ce seront d'excellentes sections de pratique. Je vais certainement le garder à l'esprit. Je vous remercie!

@ Ethan-Arrowood Vous voudrez peut-être inclure la boîte à outils en langage naturel.

J'ai ajouté des compréhensions de liste à intermédiaire

Que diriez-vous des décorateurs sous avancé? Je suppose que les gestionnaires de contexte viendront pendant la gestion des fichiers?

@ t3h2mas je mets les décorateurs sous intermédiaire.

Si vous avez ajouté for (in list) , vous pourriez peut-être aussi ajouter for (in string) ?
De plus, une introduction à l'opérateur in serait également une bonne chose (je sais que j'ai trouvé ma vie plus facile quand j'ai découvert qu'il n'était pas nécessaire de l'utiliser uniquement avec for loops: smiley :).

@AnikaErceg bonne suggestion. Terminé. J'ai ajouté est et n'est pas aussi bien.

@ginoskotheon Vous avez oublié d'ajouter for (in string) sous les boucles ou vous ne voyez pas l'intérêt d'introduire cela? : smiley:

Je suis un développeur dont la première langue était Python ... J'aide déjà avec mon chapitre FCC local et l'organisateur a suggéré que j'aimerais peut-être aider avec le nouveau programme. Je ne sais pas à 100% comment commencer à contribuer, mais j'aimerais vraiment le faire. Je suis également très actif dans la communauté Python, à la fois localement et dans son ensemble, donc je peux avoir beaucoup d'yeux bien informés en cas de besoin.

Mes premières suggestions:

  • [] faire en sorte que tous les exemples suivent PEP 8
  • [] la leçon booléenne doit être dans les «types de données» avec les valeurs «véridique» et «faux»
  • [] une partie de la bibliothèque standard doit être incluse quelque part ( itertools , collections )
  • [] certaines bibliothèques de base pourraient être incluses ( requests , scrapy , etc.)
  • [] Je ne suis pas sûr de ce que signifie 'Escape séquences' dans 'Output', mais s'il fait référence à des chaînes de style %s .... laissez cela pour un 'héritage que vous pourriez rencontrer, mais ne vraiment besoin de s'inquiéter de la section et d'enseigner simplement les chaînes de style f et .format() .
  • [] la section loop mentionne range , list et 'string' comme s'ils étaient tous différents, mais en Python ils sont tous itérables, c'est pourquoi vous pouvez les parcourir avec le même mots clés. Peut-être que cela peut être abordé dans la section «itérateurs et générateurs».

    • [] enumerate()

  • [] les gestionnaires de contexte doivent être mentionnés quelque part.
  • [] il pourrait y avoir une section avancée pour asyncio
  • [] Traditionnellement, le PEP 20 est enseigné quelque part au début avec quelques exemples spam et eggs .
  • [] tests
  • [] virtualenvs
  • [] installation
  • [ ] commentaires
    Je serais plus qu'heureux d'aider avec ce projet de toutes les manières possibles. Je pense depuis un bon moment que nous avions besoin de quelque chose comme ça.

@cldershem Tant de bonnes suggestions merci! Avec votre expérience, le meilleur type de contribution que vous puissiez apporter est d'écrire les leçons / défis eux-mêmes. Dites-moi lesquels vous souhaiteriez écrire 😄

@cldershem

Je ne sais pas à 100% comment commencer à contribuer, mais j'aimerais vraiment le faire.

https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Pull-Request-Contribute

Pourrait vous orienter dans la bonne direction.

Peut-être que @ Ethan-Arrowood accepterait également les soumissions via les commentaires Github?

@ t3h2mas Oui, comme je l'ai dit lors de la toute première leçon / défi, les soumissions peuvent être faites ici sur ce fil en tant que commentaires 😄

@cldershem Une autre façon d'aider est si vous connaissez un bon moyen de créer un défi dans le navigateur qui peut réellement être testé (avec unittest). Nous explorons toutes sortes d'options de REPL.it à codeMirror à Skulpt.

@cldershem Je devrais probablement écrire des "caractères d'échappement". Ce sont des choses comme '\ n', '\ t', etc.

Et je sais qu'ils sont itérables, mais je commence à décomposer les choses en termes de leçons individuelles.

Au fait, merci pour toutes les suggestions et toute l'aide. Je prévois de travailler sur un exemple de leçon / défi pendant le week-end et j'espère que cela pourra être une sorte de modèle pour d'autres. Si vous souhaitez vous attaquer à une leçon / défi qui fonctionne de la même manière que les défis Free Code Camp, veuillez poster votre code. J'adorerais voir ça.

@ Ethan-Arrowood @ginoskotheon @cldershem
J'aimerais également aider à rédiger les leçons et les défis du cours FCC-Python.
Je vois dans les commentaires précédents que Repl.it Classrooms n'est pas le meilleur choix, mais je peux commencer à travailler sur les leçons (titre, description, tests, etc. décrits ci-dessus). Une fois qu'une plateforme / un framework a été défini, je peux toujours modifier le code et le déplacer.
J'ai écrit quelques exemples d'exercices que vous pouvez trouver ici ; vous devriez pouvoir les voir, mais vous devez être connecté pour les importer, jeter un œil sous le capot et les modifier.
N'hésitez pas à commenter, critiquer et modifier les leçons elles-mêmes, et s'il vous plaît laissez-moi savoir quand une plate-forme / un cadre plus approprié a été décidé.
En attendant, je peux travailler sur les leçons pour débutants détaillées ci-dessus, en commençant par les mathématiques et en passant à tout ce qui doit être fait.

Salut les gars, je suis le fondateur / PDG de Repl.it. FAC nous tient à cœur et nous ferons tout ce que nous pouvons pour pouvoir apporter notre soutien ici. Quels sont les principaux obstacles à l'adoption des salles de classe Repl.it pour cela?

@amasad bonjour! Heureux de vous avoir ici 😄
Le principal obstacle auquel nous sommes confrontés en adoptant Repl.it dans le cours FCC Python est l'interfaçage avec les unittests Repl.it Classroom. Nous aimons la structure Repl.it Classroom de pouvoir exécuter un fichier indépendant avec des tests unitaires; cependant, nous ne pouvons pas comprendre comment savoir quand un utilisateur termine le défi (passe tous les tests unitaires). Bien sûr, ce comportement est intégré à Repl.it, mais afin de conserver la sensation du FreeCodeCamp actuel, nous aimerions pouvoir faire avancer l'utilisateur vers le prochain défi automatiquement (ou l'inviter à le faire) une fois qu'il a terminé le défi actuel (c'est-à-dire réussir tous les tests unitaires).

Des idées sur la façon dont nous pourrions mettre cela en œuvre? FCC est écrit en JavaScript, donc toute sorte d'API Web ou de module npm fonctionnerait plutôt bien.

Si vous pensez que beaucoup de vos téléspectateurs viendront de l'arrière-plan JavaScript, je pense qu'une introduction sur les différences serait utile. Par exemple

// javascript
var dict = {
    a : 1
};

console.log(dict.a)
# python
dict = {
    "a" : 1
}

print(dict["a"])

Un autre exemple serait de parcourir un dictionnaire ou un tableau avec des boucles for. Cela me trébuche tout le temps.

_Title_ Introduction aux Lambdas

_Description / Explication / Leçon_
srcs:

1 http://stackoverflow.com/questions/890128/why-are-python-lambdas-useful
2 http://www.secnetix.de/olli/Python/lambda_functions.hawk
3 https://pythonconquerstheuniverse.wordpress.com/2011/08/29/lambda_tutorial/
4 http://stackoverflow.com/questions/16501/what-is-a-lambda-function
5 https://en.wikipedia.org/wiki/Anonymous_function

"Une fonction anonyme (littéral de fonction, abstraction lambda) est une définition de fonction qui n'est pas liée à un identifiant." [5] Le mot "Lambda vient du Lambda Calculus" [4]. En python, un lambda est un mot-clé pour définir une fonction anonyme. En utilisant le mot-clé lambda au lieu du mot-clé def , un lambda de base ressemble à ceci: lambda x: x**2 Ceux-ci peuvent être affectés à des variables et réutilisés comme des fonctions:

>>> def f (x): return x**2
>>> print f(8)
64
>>> g = lambda x: x**2
>>> print g(8)
64

_src 2_

Les cas d'utilisation les plus courants sont de garder le code court et lisible, au lieu de diviser la définition et de l'utiliser comme dans cet exemple:

def __init__(self, parent):
    """Constructor"""
    frame = tk.Frame(parent)
    frame.pack()

    btn22 = tk.Button(frame,
        text="22", command=self.buttonCmd22)
    btn22.pack(side=tk.LEFT)

    btn44 = tk.Button(frame,
        text="44", command=self.buttonCmd44)
    btn44.pack(side=tk.LEFT)

def buttonCmd22(self):
    self.printNum(22)

def buttonCmd44(self):
    self.printNum(44)

_src 3_

Dans cette interface graphique Tkinter, une fonction doit être passée à l'attribut _command_. Les fonctions sont nommées avec des nombres car elles ont été générées avec un générateur RAD. C'est bien et fonctionnel, mais pas très lisible. Vous pouvez les renommer et cela rend les choses plus claires, mais si vous aviez de nombreux boutons, il pourrait devenir fastidieux de parcourir le code pour trouver la bonne commande, et comme ils ne renvoient qu'une valeur de base, une meilleure solution serait de définir le fonctionner ici, de manière anonyme:

frame = tk.Frame(parent)
frame.pack()

btn22 = tk.Button(frame,
        text="22", command=lambda: self.printNum(22))
btn22.pack(side=tk.LEFT)

btn44 = tk.Button(frame,
        text="44", command=lambda: self.printNum(44))
btn44.pack(side=tk.LEFT)

_src 3_

Une autre caractéristique clé de cette utilisation est qu'elle raccourcit également le code, ce qui signifie qu'il est plus facilement disponible pour le programmeur lorsqu'il recherche un outil dans le cadre d'une solution plus large.

_Code invite / défi_
Écrivez une expression lambda qui possède les fonctionnalités clés décrites ci-dessus; rendre le code plus lisible en déplaçant tout le code utilisé au même endroit; résultant en un code plus court et plus naturel.

_Code prédéfini_

# only edit below this line
def y(z):
  return abs(5-z)

print(sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=y))

_src 1_

_Solution_
print(sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x)))

@robbiemu excellent travail! Ma seule suggestion serait d'ajouter un commentaire dans la section Code prédéfini à côté de la ligne d'impression qui dit quelque chose comme # only edit this line . Je pense également que c'est du code python 2 et que nous allons enseigner python 3, donc je pense que le seul changement est que la ligne d'impression nécessite l'encapsulation '()'.
Nous vous remercions de votre contribution!

Ethan, merci. Je vais continuer à travailler là-dessus. Le problème et la solution pourraient être modifiés afin qu'il y ait également des tests raisonnables (sans utiliser un ensemble de données statiques, comme je l'ai ici). J'aimerais voir un exemple de leçon sur la meilleure approche pour y parvenir.

@robbiemu bien sûr. Nous travaillons toujours sur REPL.it et mettrons à jour ce fil dès que nous en saurons plus. Bon travail pour l'instant 😄

C'est l'un des défis de code de la section Débutant - Maths répertoriés au début de ce fil.

_Title_ - Valeur absolue

_Description / Explication / Leçon_ -
La valeur absolue fait référence à la distance entre un nombre et zéro.
Si un nombre est négatif, abs () le convertira en positif.
En abs (x), x peut être un nombre entier, flottant ou complexe.
https://docs.python.org/3/library/functions.html#abs
https://docs.python.org/3/library/stdtypes.html#numeric -types-int-float-complex

>>> abs(2)
2
>>> abs(-2)
2
>>> abs(-2.0)
2.0

_Code Invite / Challenge_ -
La variable valeur_absolue vaut -42.
Modifiez valeur_absolue pour qu'elle corresponde à la valeur absolue de -42.

_Code prédéfini_ -

absolute_value = -42

_Solution_ --

absolute_value = abs(-42)

_Tests_ -

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(absolute_value, int)
        self.assertEqual(absolute_value, 42)

@bgroveben LGTM. bon travail!

@ Ethan-Arrowood Merci! J'ai également rédigé des leçons pour les autres défis de base / mathématiques énumérés ci-dessus. Je peux publier chacun d'eux sur ce fil si vous le souhaitez. De plus, je pense que ce serait une bonne idée d'inclure round (), sum (), max () et min () avec les cours de mathématiques de base - ils vous seront utiles.

@bgroveben Je vais le marquer comme terminé et oui s'il vous plaît. Faites aussi chaque défi dans un commentaire séparé s'il vous plaît; il sera plus facile de faire référence pour les changements ou autre. Merci pour vos contributions!

@ Ethan-Arrowood

@amasad bonjour! Heureux de vous avoir ici 😄

Heureux d'être ici 💃

Le principal obstacle auquel nous sommes confrontés en adoptant Repl.it dans le cours FCC Python est l'interfaçage avec les unittests Repl.it Classroom. Nous aimons la structure Repl.it Classroom de pouvoir exécuter un fichier indépendant avec des tests unitaires; cependant, nous ne pouvons pas comprendre comment savoir quand un utilisateur termine le défi (passe tous les tests unitaires). Bien sûr, ce comportement est intégré à Repl.it, mais afin de conserver la sensation du FreeCodeCamp actuel, nous aimerions pouvoir faire avancer l'utilisateur vers le prochain défi automatiquement (ou l'inviter à le faire) une fois qu'il a terminé le défi actuel (c'est-à-dire réussir tous les tests unitaires).

Des idées sur la façon dont nous pourrions mettre cela en œuvre? FCC est écrit en JavaScript, donc toute sorte d'API Web ou de module npm fonctionnerait plutôt bien.

Le plus simple est de le cuire. Avoir un réglage du côté enseignant des choses qui dit "avance automatique" ou quelque chose comme ça. (Nous ne sommes pas contre l'ajout de webhooks, etc., mais pour réduire la complexité) Cela fonctionnerait-il?

@amasad en utilisant une fonction "avance automatique", nous pourrions sûrement émuler FreeCodeCamp dans une salle de classe Repl.it, mais nous ne pourrions toujours pas suivre les progrès des utilisateurs du côté de FCC, ce qui est assez crucial pour la sensation de FCC.

Qu'en est-il d'une fonctionnalité qui nous permet de GET / POST des données d'une «salle de classe». De cette façon, nous pourrions faire quelque chose comme:

repl.getUser('classroomID', 'userID').then( () => {
    // do stuff async 
}).catch( (error) => {
    // handle error
});

ou mieux encore:

repl.getProgress('classroomID', 'lessonID', 'userID').then( () => { }).catch( (e) => { });

Maintenant, ces deux méthodes fonctionneraient de notre côté, mais comme la salle de classe REPL est intégrée via une iframe, nous aurions au moins besoin de déclencheurs d'événements simples du côté de REPL afin de suivre correctement la progression de chaque utilisateur.

De plus, étant donné que la salle de classe serait intégrée via une iframe, pourrions-nous potentiellement obtenir une fonctionnalité permettant à la salle de classe d'exécuter des lignes de JavaScript (que nous pouvons définir via le portail des enseignants) lorsqu'un utilisateur termine une leçon. communiquer avec FCC?

Nous espérons pouvoir utiliser les classes REPL non seulement pour Python, mais également pour d'autres langages. Une fois que le programme FCC Python sera opérationnel avec succès, nous passerons à l'implémentation de langages comme Java ou C ++ (ou littéralement n'importe quel langage que REPL peut nous proposer d'utiliser!).

J'aimerais avoir l'opinion de @QuincyLarson à ce sujet ainsi que d'autres contributeurs principaux de FCC (je vais essayer de les contacter sur Gitter / Forums).

Salut à tous, merci beaucoup pour les commentaires et suggestions.

@amasad Merci d'avoir pris le temps de partager vos pensées et vos idées ici. C'est formidable de savoir que REPL.it travaille sur le produit de la classe, que nous aimerions intégrer dans la plate-forme.

Pour commencer, ce serait formidable si nous pouvions aborder cela dans une discussion distincte au lieu de ce fil de programme, pour le garder plus pertinent pour l'intégration elle-même.

@ Ethan-Arrowood Un travail formidable avec l'initiative. Merci pour votre travail acharné.

@amasad @QuincyLarson J'ai officiellement déplacé la discussion de la classe REPL vers ce fil de discussion (conformément à la recommandation @raisedadead ). https://github.com/freeCodeCamp/freeCodeCamp/issues/14736

suite au commentaire de cldershem (commenté il y a 8 jours), en voici un pour collections -

Titre

namedtuples

Description / Explication / Leçon

1 https://en.wikipedia.org/wiki/Tuple
2 https://docs.python.org/3.6/library/collections.html
3 https://docs.python.org/3.6/library/collections.html#collections.namedtuple
4 https://pythonprogramming.net/reading-csv-files-python-3/

Un tuple est un concept courant en mathématiques. Il est considéré comme une liste d'éléments finis. [1] En python, ils sont fonctionnellement similaires aux dictionnaires, où les clés sont définies à l'avance. Namedtuples peut être utilisé pour fournir un arbre de propriétés rapide pour toute utilisation: comme si votre application doit traiter des chaussettes et que toutes les chaussettes ont une taille et un prix, alors un tuple avec deux champs est utile, se rapprochant du dictionnaire {size: _size_, price: _price_} . Pour obtenir un tuple avec ces champs, vous passez les champs à la fonction d'usine collections.namedtuple : [2]
collections.namedtuple(Socks, ['size', 'price'])
Pour plus de commodité, en particulier lors du traitement des informations provenant de sources de texte brut, les noms de champ peuvent être un tableau ou une seule chaîne avec des valeurs séparées par des virgules et / ou des espaces: [3]
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
Tout identifiant Python valide peut être utilisé pour un _fieldname_ sauf pour les noms commençant par un trait de soulignement. Les identificateurs valides se composent de lettres, de chiffres et de traits de soulignement, mais ne commencent pas par un chiffre ou un trait de soulignement et ne peuvent pas être un mot-clé tel que class, for, return, global, pass ou augmenter. [3]
Une fois générés, ils peuvent être utilisés pour créer des instances avec des entrées de type dictionnaire:

Point = namedtuple('Point', ['x', 'y'])
p = Point(x=11, y=22)
p[0] + p[1] # 33
x, y = p # (11, 22)
p.x + p.y # 33
p # Point(x=11, y=22)

_de_ [3]

Invite de code / défi

Une bonne utilisation de namedtuples est de faciliter l'ingestion de données, comme à partir d'une exportation csv à partir d'une base de données. Dans le code suivant, corrigez cette importation CSV avec un tuple.

Code prédéfini

import csv
import collections

# only change code below this line!
recordData = ['fieldNames'] # find the fieldnames in the code below
# only change code above this line!
EmployeeRecord = collections.namedtuple('EmployeeRecord', recordData)

with open('employee-records.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    for row in readCSV:
# onlt change code below this line!
        name = row[0]
        age = row[1]
        title = row[2]
        department = row[3]
        paygrade = row[4]

        processEmployee([name, age, title, department, paygrade]) # fails because processEmployee accepts an EmployeeRecord Tuple!
# only change code above this line!

_ dérivé de_ [4]

_note_: ce qui précède utilise un fichier réel, mais nous pourrions remplacer les lignes with ... readCSV par quelque chose comme:
readCSV = csv.reader(['Alan,42,Manager,Sales, N1', 'Beth,38,Regional Director,Operations,CO','Robin,23,Associate,Sales,C2']

Solution

import csv
import collections

# only change code below this line!
recordData = ['name', 'age', 'title', 'department', 'paygrade']
# only change code above this line!
EmployeeRecord = collections.namedtuple('EmployeeRecord', recordData)

with open('employee-records.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    for row in readCSV:
# onlt change code below this line!
        employee = EmployeeRecord(*row)

        processEmployee(employee)
# only change code above this line!

Leçon 2:

Titre

namedtuples._make

Description / Explication / Leçon

1 https://docs.python.org/3.6/library/collections.html#collections.namedtuple

Une méthode de NamedTuples appelée __make_ facilite la génération d'instances dans une fonction d'itération, ce qui rendrait le problème de la leçon précédente encore plus laconique.
Ceci est utilisé comme:

for emp in map(EmployeeRecord._make, allRows):
    print(emp.name, emp.title)

Invite de code / défi

Nous revisitons la leçon précédente et révisons le code. C'est presque là, mais le travail n'est pas terminé. Pour votre commodité, certains enregistrements sont imprimés où vous devez traiter l'enregistrement. N'oubliez pas que nous devons créer un EmployeeRecord et le transmettre à une fonction ailleurs dans le code, comme:

        employee = EmployeeRecord(*row)

        processEmployee(employee)

Code prédéfini

import csv
from collections import namedtuple

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
# only change code below this line!
    print(emp.name, emp.title)

Solution

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
# only change code below this line!
    processEmployee(emp)

Nous pourrions probablement aussi utiliser des leçons rapides illustrant:

  • n = NamedTuple(**Dictionary)
  • utilisation de ._fields pour créer des formes alternatives: TwoD = namedtuple('TwoD', 'x y') => ThreeD = namedtuple('ThreeD', TWo._fields + ('z',))
  • couverture des cas d'utilisation de base: ingestion de données (comme le csv), transactions de base de données, transactions réseau, facilitation des POJO (ou ... les POPO sont-ils une chose en Python? lol)

Voici le reste des défis mathématiques pour débutants:

__Title: __ Ajout de Python

__Description / Explication / Leçon: __

En Python, un entier (int) est l'un des 3 types numériques distincts.
Dans cet exercice, vous allez ajouter deux entiers à l'aide de l'opérateur plus (+).

>>> 2 + 2
4

__Code invite / défi: __

Modifiez le 0 pour que le total soit égal à 20.

__Code prédéfini: __

total = 10 + 0

__Solution:__

total = 10 + 10

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(total, int)
        self.assertEqual(total, 20)

__Titre:__
Calculez le quotient et le reste en utilisant la fonction divmod ().

__Description / Explication / Leçon: __

Divmod prend deux nombres (non complexes) comme arguments et renvoie une paire de nombres comprenant leur quotient et leur reste lors de l'utilisation de la division entière.
Pour les entiers, le résultat est le même que (a // b, a% b).

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

__Code invite / défi: __

Dans cet exercice, les variables a et b sont définies pour vous.
Définissez une variable nommée result qui appelle la fonction divmod sur les variables a et b (dans cet ordre).

__Code prédéfini: __

a = 11
b = 3

__Solution:__

a = 11
b = 3
result = divmod(a, b)

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(result, tuple)
        self.assertEqual(result, (3, 2))

__Title: __ Exposants Python

__Description / Explication / Leçon: __

Python utilise l'opérateur double astérisque (**) pour gérer l'exponentiation.
Le nombre avant les astérisques est la base et le nombre après l'exposant.
Python vous permet également d'utiliser la fonction intégrée pow (x, y), qui vous donne x à la puissance de y.

>>> 2 ** 2
4
>>> pow(2, 4)
16

__Code invite / défi: __

Dans la console, vous recevez deux variables, a et b.
En utilisant l'une ou l'autre des méthodes décrites dans cette leçon, définissez une variable nommée puissance égale à a à la puissance b.

__Code prédéfini: __

a = 3
b = 4

__Solution:__

a = 3
b = 4
power = pow(a, b)
# or #
power = a ** b

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(power, int)
        self.assertEqual(power, 81)

__Title: __ Division des flotteurs Python

__Description / Explication / Leçon: __

Python 3 fait la distinction entre la division entière (plancher) et la division flottante (vraie).
Python utilise un seul opérateur de barre oblique (/) pour la division flottante.
Lorsque vous utilisez la division par virgule flottante, même si le quotient (résultat) est un nombre entier comme 1 ou 2, un nombre à virgule flottante sera renvoyé au lieu d'un entier.

>>> 1 / 1
1.0
>>> 3 / 2
1.5

__Code invite / défi: __

Lorsque vous exécutez le code existant, la variable nommée quotient aura une valeur de 1,0.
Modifiez le deuxième nombre (le dénominateur) de sorte que le quotient ait une valeur de 2,5.

__Code prédéfini: __

quotient = 5 / 5

__Solution:__

quotient = 5 / 2

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(quotient, float)
        self.assertEqual(quotient, 2.5)

__Title: __ Division d'entiers Python

__Description / Explication / Leçon: __

Python 3 fait la distinction entre la division entière (plancher) et la division flottante (vraie).
Python utilise un opérateur double barre oblique (//) pour la division entière.
Lors de l'utilisation de la division entière, Python arrondira le quotient au nombre entier le plus proche.

>>> 1 // 1
1
>>> 3 // 2
1

__Code invite / défi: __

Lorsque vous exécutez le code existant, la variable nommée quotient aura une valeur de 1.
Modifiez le deuxième nombre (le dénominateur) pour que le quotient ait une valeur de 2.

__Code prédéfini: __

quotient = 5 // 5

__Solution:__

quotient = 5 // 2

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(quotient, int)
        self.assertEqual(quotient, 2)

__Title: __ Valeur maximale Python

__Description / Explication / Leçon: __

La fonction max () retourne le plus grand élément d'un itérable (comme une liste ou une chaîne), ou le plus grand de deux ou plusieurs arguments.
En donnant un itérable comme argument, nous devons nous assurer que tous les éléments de l'itérable sont du même type.
Si l'itérable est vide et que la valeur par défaut n'est pas fournie, une ValueError est déclenchée.

>>> max(1,2,3,4)
4
>>> list1 = ['a', 'e', 'i', 'o', 'u']
>>> max(list1)
'u'
>>> string1 = "largest"
>>> max(string1)
't'

__Code invite / défi: __

Le code de démarrage a une liste de nombres nommés, eh bien, des nombres.
La variable la plus élevée est initialisée aux nombres.
Faites en sorte que la valeur la plus élevée soit égale au plus grand nombre en nombres.

__Code prédéfini: __

numbers = [8, 2, 4, 3, 6, 5, 9, 1]
highest = numbers

__Solution:__

numbers = [8, 2, 4, 3, 6, 5, 9, 1]
highest = max(numbers)

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(highest, int)
        self.assertEqual(highest, 9)

__Title: __ Valeur minimale de Python

__Description / Explication / Leçon: __

La fonction min () renvoie le plus petit élément d'un itérable (comme une liste ou une chaîne), ou le plus petit de deux ou plusieurs arguments.
En donnant un itérable comme argument, nous devons nous assurer que tous les éléments de l'itérable sont du même type.
Si l'itérable est vide et que la valeur par défaut n'est pas fournie, une ValueError est déclenchée.

>>> min(1,2,3,4)
1
>>> list1 = ['a', 'e', 'i', 'o', 'u']
>>> min(list1)
'a'
>>> string1 = "smallest"
>>> min(string1)
'a'

__Code invite / défi: __

Le code de démarrage a une liste de lettres nommées, enfin, des lettres.
La variable la plus basse est initialisée aux lettres.
Faites en sorte que la valeur la plus basse soit égale à la «plus petite» lettre (alphabétique en premier) en lettres.

__Code prédéfini: __

letters = ['m','o','n','t','y','p','y','t','h','o','n']
lowest = letters

__Solution:__

letters = ['m','o','n','t','y','p','y','t','h','o','n']
lowest = min(letters)

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(lowest, str)
        self.assertEqual(lowest, 'h')

__Title: __ Multiplication Python

__Description / Explication / Leçon: __

Python utilise l'opérateur astérisque (*) pour la multiplication.

>>> 3 * 3
9

__Code invite / défi: __

Modifiez le 0 pour que le produit soit égal à 80.

__Code prédéfini: __

product = 8 * 0

__Solution:__

product = 8 * 10

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(product, int)
        self.assertEqual(product, 80)

__Title: __ Python reste

__Description / Explication / Leçon: __

L'opérateur% (modulo) produit le reste de la division du premier argument par le second.
L'opérateur modulo produit toujours un résultat avec le même signe que son deuxième opérande (ou zéro).

>>> 3 % 2
1
>>> 3 % 2.0
1.0

Un moyen simple de déterminer si un nombre est pair ou impair consiste à vérifier le reste lorsque ce nombre est divisé par 2.
Pour les nombres impairs, le reste est 1.
Pour les nombres pairs, le reste est égal à 0.

>>> 3 % 2
1
>>> 4 % 2
0

__Code invite / défi: __

Définissez le reste de la variable égal au reste de 11 divisé par 3 à l'aide de l'opérateur modulo (%).

__Code prédéfini: __

remainder = "Solution goes here"

__Solution:__

remainder = 11 % 3

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(remainder, int)
        self.assertEqual(remainder, 2)

__Title: __ Arrondi Python

__Description / Explication / Leçon: __

La fonction round (nombre, n chiffres) renvoie un nombre donné arrondi à une précision de n chiffres après la virgule décimale.
Si n-chiffres est omis ou vaut None, il renvoie l'entier le plus proche à son entrée.
La valeur de retour est un entier si elle est appelée avec un argument, sinon elle est du même type que le nombre donné.

>>> round(5)
5
>>> round(5.5)
6
>>> round(5.555, 1)
5.6

__Code invite / défi: __

La variable plus long_pi a trop de chiffres après la décimale.
Créez une variable nommée short_pi que nous pouvons utiliser à la place.
Utilisez la fonction round () pour afficher uniquement les 2 premiers chiffres après la virgule décimale, et attribuez cette valeur à short_pi.

__Code prédéfini: __

longer_pi = 3.14159265358979323846

__Solution:__

longer_pi = 3.14159265358979323846
shorter_pi = round(longer_pi, 2)

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(shorter_pi, float)
        self.assertEqual(shorter_pi, 3.14)

__Title: __ Racine carrée Python

__Description / Explication / Leçon: __

La fonction math.sqrt () fait partie du module mathématique de Python, qui est toujours disponible mais doit être importé.
Math.sqrt (x) renvoie la racine carrée de x sous forme de nombre à virgule flottante.

>>> import math
>>> math.sqrt(4)
2.0
>>> math.sqrt(2)
1.4142135623730951

__Code invite / défi: __

La variable square_root est définie comme le nombre 81.
Modifiez square_root pour qu'il soit égal à la racine carrée de 81.
Le module mathématique a été importé pour vous.

__Code prédéfini: __

import math
square_root = 81

__Solution:___

import math
square_root = math.sqrt(81)

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(square_root, float)
        self.assertEqual(square_root, 9.0)

__Title: __ Soustraction Python

__Description / Explication / Leçon: __

En Python, un entier (int) est l'un des 3 types numériques distincts.
Dans cet exercice, vous soustrayez deux nombres entiers à l'aide de l'opérateur moins (-).

>>> 2 - 1
1

__Code invite / défi: __

Modifiez le 0 pour que le total soit égal à 10.

__Code prédéfini: __

total = 20 - 0

__Solution:__

total = 20 - 10

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(total, int)
        self.assertEqual(total, 10)

__Title: __ Somme Python

__Description / Explication / Leçon: __

La fonction sum (iterable) ajoute tous les éléments d'un iterable Python (liste, tuple, etc.) de gauche à droite et renvoie le total.
Il existe un deuxième argument facultatif, start, qui vaut par défaut 0 et est ajouté au total.
Les éléments de l'itérable sont normalement des nombres et la valeur de départ n'est pas autorisée à être une chaîne.

>>> numbers = [1, 2, 3, 4, 5]
>>> sum(numbers)
15
>>> sum(numbers, 1)
16
>>> sum(numbers, 10)
25

__Code invite / défi: __

Il existe deux listes de nombres.
Recherchez la somme de tous les éléments des deux listes et attribuez cette valeur à une variable nommée total.

__Code prédéfini: __

list1 = [1, 3, 5, 7, 9]
list2 = [2, 4, 6, 8, 10]

__Solution:__

list1 = [1, 3, 5, 7, 9]
list2 = [2, 4, 6, 8, 10]
total = sum(list1, sum(list2))

__Tests: __

class UnitTests(unittest.TestCase):
    def test_main(self):
        self.assertIsInstance(total, int)
        self.assertEqual(total, 55)

Je pense que cela couvre toutes les leçons énumérées dans la section de base / mathématiques.
Veuillez me faire savoir si vous souhaitez en ajouter d'autres.
N'hésitez pas non plus à apporter des modifications, des changements, des suggestions, etc.
J'ai toutes les leçons que je viens de publier dans des fichiers .py et .md à:
https://github.com/bgroveben/FCC_Python.
J'ai également mis en place une salle de classe REPL à:
https://repl.it/community/classrooms/18388.

Veuillez noter - nous déplaçons la discussion sur nos défis de codage Python vers ce nouveau référentiel: https://github.com/freeCodeCamp/python-coding-challenges/issues

Publier ici pour référence:
Je pense que le Max et le Min voudront peut-être les deux:

  1. Utilisez des nombres pour plus de clarté - les utilisateurs peuvent ne pas savoir comment un caractère est un entier
  2. Assurez-vous d'utiliser plusieurs instances d'un même numéro - pour vraiment conduire le comportement
Cette page vous a été utile?
0 / 5 - 0 notes