В Python, как я мог сделать этот трехстрочный код в однострочный код? - PullRequest
4 голосов
/ 22 ноября 2010

Вот код

from sys import argv
script,from_file, to_file = argv
open(to_file,'w').write(open(from_file).read())

Я новичок в Python, и я Изучаю Python с трудом , за дополнительную плату за одну проблему, он говорит, что автор книги смог сделать код одной строкой Так что мне удалось сократить его до 3 строк, но я застрял.

Хотите помочь?

Да, и код копирует содержимое одного файла в другой, или он предназначен для этого. Это моя цель.

Ответы [ 7 ]

9 голосов
/ 22 ноября 2010

Это можно сделать как одно выражение , то есть без запятой:

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

или

open(__import__('sys').argv[2], "w").write(open(__import__('sys').argv[1]).read())

Конечно, никто неих здравый смысл предпочел бы это вашему примеру кода.Единственное изменение, которое я хотел бы сделать, заключается в том, что нет причин присваивать имена файлов временным переменным:

from sys import argv
open(argv[1],'w').write(open(argv[2]).read())

Более точный способ написания на Pythonic:Вы можете начать использовать argparse, чтобы сделать чтение из командной строки более надежным ...

6 голосов
/ 22 ноября 2010

Вы можете использовать точку с запятой, чтобы сохранить оператор импорта в той же строке. И ссылаться на элементы в argv напрямую вместо использования переменных.

from sys import argv; open(argv[2],'w').write(open(argv[1]).read())
3 голосов
/ 22 ноября 2010

Две вещи, которые вам нужно знать:

1) Вы можете включить несколько операторов Python в одну строку, разделяя их точкой с запятой

2) Вам не нужно перемещатьпараметры командной строки в отдельные переменные для их использования.

1 голос
/ 22 ноября 2010

Чтобы избежать кратного __import__ @katrielalex, вы можете сделать:

(lambda a:open(a[2],"w").write(open(a[1]).read()))(__import__('sys').argv)

Это короче, но уродливо.

0 голосов
/ 23 марта 2016

Я тоже учусь этому.

from_file, to_file = raw_input("copy from: "), raw_input("copy to: ")

open(to_file, 'w').write(open(from_file).read())
0 голосов
/ 22 ноября 2010

Вы можете избавиться от второй строки, а ссылку argv прямо в третьей.Чтобы объединить оставшиеся строки, вы можете использовать точку с запятой.Это обман, но я не вижу лучшего решения, так как вы должны импортировать sys.

from sys import argv; open(argv[2],'w').write(open(argv[1]).read())
0 голосов
/ 22 ноября 2010
import sys

open(sys.argv[3], 'w').write(open(sys.argv[2]).read())

, вероятно, лучшее, что вы можете сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...