2010-08-24 23 views
19

Je fais le fantastique Learn Python The Hard Way de Zed Shaw, mais une question supplémentaire m'a bloqué: Ligne 9--10 pourrait être écrit dans une ligne, comment? J'ai essayé quelques pensées différentes, mais en vain. Je pourrais passer à autre chose, mais qu'est-ce que ce serait amusant? Zed écrit aussi qu'il pourrait faire tout le script en une seule ligne. Je ne suis pas exactement sûr de ce qu'il veut dire par là. N'hésitez pas à m'aider comme vous le souhaitez: en donnant la réponse ou simplement laisser entendre --- et peut-être y compris une réponse cachée ou cachée à la question.En savoir Python l'exercice Hard Way 17 Question supplémentaire (s)

+0

Pour les expressions plus difficiles, vous devez éviter de bourrer autant que possible sur une ligne. – leoluk

+0

Si vous n'avez pas de blocs indentés, vous pouvez simplement enchaîner chaque ligne, terminée par un point-virgule. * Très * mauvaise forme, mais si vous êtes d'accord ... –

+1

Ou si vous voulez vraiment être une douleur dans le cul: http://effbot.org/pyfaq/is-it- possible d'écrire-obfuscated-one-liners-in-python.htm –

Répondre

18
indata = open(from_file).read() 
+0

Cela peut également être fait lors de l'écriture. –

+13

ouais - bien que cela (ainsi que la solution à deux lignes) laissera le fichier ouvert plus longtemps que nécessaire, vous devriez donc éviter cela en code réel (une meilleure façon de le faire dans une ligne est 'avec open (from_file) comme f: indata = f.read() ', si vous voulez enregistrer des lignes juste pour l'enfer) – delnan

+0

Cela semble le plus proche du Python a été enseigné jusqu'à cet exercice. Je ne vois pas comment quelqu'un serait en mesure d'inférer une telle solution à partir d'un arrière-plan complètement nouveau - je connais aussi Java, mais je n'aurais pas pensé à quelque chose comme ça. Existe-t-il une terminologie spéciale pour cette mesure spécifique? Je n'arrive pas à comprendre comment quelqu'un pourrait comprendre cela, mais peut-être que les questions supplémentaires visent simplement un niveau plus élevé que je ne le pensais. Peu importe, merci beaucoup.Je n'aurais probablement pas compris sans la solution explicite. La même chose s'applique à l'aide de tout le monde. – Kiwi

8

shutil est la façon de faire des copies de fichiers d'une doublure en Python:

shutil.copy(sys.argv[1], sys.argv[2]) 

Mettre le import shutil, sys sur la même ligne que celle-ci (avec un point-virgule entre les deux, bien sûr) serait cependant être stylistiquement goofy ;-).

+0

Cela ne semble pas répondre à la question, cependant? Habituellement, les tutoriels de programmation se concentrent sur des concepts, de sorte que les réponses utilisant différents concepts semblent moins utiles à l'étudiant. –

+0

"Moins de valeur" que _what_? ''; '' join' de toutes les lignes non-comment? -) –

6

Eh bien, vous pouvez simplement faire "substitution algébrique", non? ... en supposant que vous ne se soucient pas de la « interface utilisateur » ...

open(to_file, 'w').write(open(from_file).read()) 
+1

rappelez-vous 'to_file = argv [2]', etc! –

+0

Exercice laissé pour le lecteur? :) –

1

Je suis d'accord avec la substitution algébrique mentionné par @ tiret-tom-bang. Mon fonctionnement Exercice 17 crédit supplémentaire a 5 lignes. L'opération est menée sur une ligne.

ouverte (to_file, 'w'). Écrire (ouverte (from_file) .Lire())

suivi d'un simple 'impression' pour la rétroaction de vérification

print « Fichier% s copiés dans « % s% (from_file, to_file)

je devrais avoir une 6e ligne qui remplace l'original « » output.close « » mais je suis confus sur la façon de le faire sans « » sortie « » variables ? Ahh, puisque je n'ai plus de variable de sortie, il n'y a rien à fermer.

btw- Il est un peu effrayant pour moi de voir la même ligne exacte tapée ici que j'ai travaillé et entré moi-même dans gedit. Très bien, j'apprécie vraiment le défi mental et le soutien de la communauté.

Edit: répondu à ma propre question

1

essayez le code suivant:

import shutil, sys; shutil.copy(sys.argv[0], sys.argv[2]) 
3
from sys import argv 
open(argv[2], 'w').write(open(argv[1]).read()) 
+0

C'est aussi proche que je pourrais avoir aussi. Je suppose que la déclaration d'importation pourrait être sur la même ligne mais je ne sais pas encore comment faire/plus 2 lignes semble assez bon :) –

+0

'from sys import argv; open (argv [2], 'w'). write (open (argv [1]). read()) 'Cela fonctionne bien et il n'y a que 69 colonnes dans un éditeur de texte. – iyrin

+0

Note du livre: 'That; dépend ; sur ; Comment ; toi ; définir un ; ligne ; de; code.' – iyrin

0

Il répond à cette ci-dessous dans la section "Questions d'élèves ordinaires"

pas moyen faites ceci une ligne!

Cela; dépend ; sur ; Comment ; toi ; définir un ; ligne ; de; code.

1
output = open(to_file, 'w') 
output.write(indata) 

peut être écrit comme

open(to_file, 'w').write(indata) 
0

Hey Kiwi (et quiconque d'autre trouve cela!),

Je suis sur le même exercice et je crois que je l'ai craqué.

Il y a deux lectures possibles de la phrase «Je pourrais faire de cette ligne une longue» de Shaw.

  1. Il pourrait faire le script Python une longue ligne, sur l'importation de toutes les commandes nécessaires à partir des modules, par exemple from sys import argv, etc.
  2. Il pourrait copier le contenu d'un fichier à l'autre dans une ligne en utilisant la commande ligne.

Personnellement, je pense qu'il veut dire le dernier, mais je vais expliquer les deux solutions pour l'apprentissage!

La première solution (longue): Vous devez reconnaître que vous avez besoin des lignes import x from de y dans le fichier Python, sinon argv et exist ne fonctionnera pas car ils n'ont été implicitement fait référence, à savoir que vous n'ont pas fait comprendre à Python que vous voulez utiliser ces fonctions.

La prochaine chose à faire est de supprimer tout le code non pertinent, avec le code étant sans pertinence qui est écrit au profit de l'utilisateur, à savoir print, raw_input(), len(), etc.

Si vous faites cela, vous serez à gauche avec:

from sys import argv 
from os.path import exists 

script, from_file, to_file = argv 

indata = open(from_file).read() 

out_file = open(to_file, 'w') 
out_file.write(indata) 

out_file.close() 
in_file.close() 

Pour que cela soit encore plus court, vous pouvez commencer l'imbrication des variables et la fonction dans un autre. C'est le même principe que dans les mathématiques où vous pouvez définir une fonction et ensuite substituer la variable représentant cette fonction dans une autre fonction.

Par exemple:

y = x + 3 
z = y, which is essentially z = (x + 3) 

Si vous travaillez ce à travers, vous pouvez simplifier le code jusqu'à:

from sys import argv 
from os.path import exists 

script, from_file, to_file = argv 

(open(to_file, 'w').write(open(from_file).read())) 

Vous pouvez alors utiliser beaucoup de ; pour relier toutes les lignes de code et vio-la vous avez terminé.

Remarque: Vous n'avez pas besoin de fermer les fichiers, comme vous l'avez fait dans l'original, car Python les ferme automatiquement lors de l'exécution du script.

La deuxième solution (Short):

Si vous regardez son 'Qu'est-ce que vous devriez voir' article, il utilise le chat dans le terminal. C'est court pour la concaténation, qui est un moyen de relier les chaînes ensemble.Si vous le combinez avec> vous pouvez remplacer le contenu d'un fichier avec un autre en une ligne:

cat from_file.txt > to_file.txt 

Voilà. Une ligne qui va prendre le contenu d'un fichier et le mettre dans un autre.

Bien sûr, les deux solutions ne sont pas parfaites, car la première n'est pas vraiment une ligne et la seconde n'utilise même pas Python!

Commentaires apprécié, je ne commencé à le faire il y a deux jours ...

0

La coupe de tout ce que vous n'avez pas besoin, toutes les « fonctionnalités que vous n'avez pas besoin » comme Zed dit, et vous obtenez un ligne. Il a même moins de 80 caractères, il ne peut pas être plus «pythonique» que ça!

à partir de sys import argv; s, f, t = argv; (Ouverte (t, « w »). Écrire (ouverte (f) .Lire()))

0

Tout ce qu'il dit est que vous pouvez utiliser pour mettre un point-virgule deux lignes sur une ligne et le faire tourner

in_file = open(from_file); indata = in_file.read() 

vous pouvez le faire avec tout le morceau de code si vous vouliez

0

Je fais aussi le même livre en ligne. J'ai essayé, et cela a fonctionné:

open(to_file, 'w').write(open(from_file).read()) 

En d'autres termes, j'ai ouvert le fichier que je copiais dans le mode d'écriture, puis inséré le contenu du fichier que je copiais à partir, après l'ouverture et la lecture, dans la fonction d'écriture. J'ai vérifié mes fichiers et cela a fonctionné. Yay!

0

Avait du plaisir avec celui-ci. En répondant à cela, je cherchais une solution qui a préservé la fonctionnalité, utilisé les commandes de fichier de l'exercice et n'utilisait pas ";" combiner des lignes. Le plus proche que je pourrais venir est

open(input("Out?: "), 'w').write(open(input("In?: ")).read()) 

Pas tout à fait la même fonctionnalité car elle invite pour l'entrée plutôt que de prendre la ligne de commande. Mais une seule ligne qui fait le travail tout en utilisant les commandes du fichier dans l'exercice et en évitant de concaténer les lignes en utilisant un point-virgule.