Информация об изменениях

Сообщение Re[14]: MS забило на дотнет. Питону - да, сишарпу - нет? от 05.09.2021 11:30

Изменено 05.09.2021 11:52 vfedosov

Re[14]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, vfedosov, Вы писали:



S>>> Есть прекраснейшая конструкция yield на основании которой ты можешь строить любые итераторы.

S>>>Для использования как в питоне, нужно просто сконструировать класс который будет держать данные о массиве.
S>>>Лениво

V>>Вот и мне лениво — поэтому предпочитаю на Пайтоне простые задачи решать. Одна из основных концепций Пайтона — простые вещи должны делаться просто.

V>>Про yield я в курсе. Он и на Пайтоне есть — с точно такой-же функциональностью. Думаю с Пайтона его и собрали в .Net — хотя не уверен.
S>На самом деле на шарпе можно решать любые задачи с той же эффективностью. Учитываю, что большинство использует нетипизированный питон, то на шарпе используя
S>интеллисенс и прочие удобства IDE можно писать даже быстрее.
S> Это уже дело привычки

Ну давай рассмотрим простую задачу — задание пишу вообще от балды — не подстраивая под Пайтон: открыть файл с именами сотрудников и зарплатами, распарсить все строки и выдать имя наиболее высокооплачиваемого работника. Никакие сторонние библиотеки не используем, как и парсеры CSV — иначе это сравнение библиотек, а не языков. Пример файла:
Иванов, 1000
Петров, 2000
Сидоров, 3000

Для простоты считаем, что все строки содержат корректные записи — ошибки обрабатывать не надо.

На Пайтоне я решу задачу не задумываясь так (наверняка есть решения и еще более лаконичные):
employees = []

for line in open("D:\\test.txt", encoding="utf-8").readlines():
    items = line.split(",")
    employees.append((items[0], int(items[1])))

employees.sort(key=lambda i: i[1])
print("Employee with the biggest salary is: ", employees[-1][0])


Это полное решение — не нужны никакие import, не нужен проектный файл — это уже готовый к исполнению файл
На C# я буду вынужден нахреначить минимум втрое больше кода и еще и проект создать для этого:

using System;
using System.IO;    
using System.Collections.Generic;
using System.Text;

public class Program
{
    public static void Main()
    {
        var employes = new List<(string n, int s)>();

        foreach(var line in File.ReadAllLines("D:\test.txt", Encoding.UTF8))
        {
            var items = line.Split(',');
            employes.Add((items[0], Int32.Parse(items[1])));
        }
        
        employes.Sort((i, j) => i.s.CompareTo(j.s));
        Console.WriteLine("Employee with the biggest isalary is: " + employes[employes.Count - 1].n);
    }
}


Так что для простых вещей эффективность решений отличается в разы, как я уже говорил.
Re[14]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, vfedosov, Вы писали:



S>>> Есть прекраснейшая конструкция yield на основании которой ты можешь строить любые итераторы.

S>>>Для использования как в питоне, нужно просто сконструировать класс который будет держать данные о массиве.
S>>>Лениво

V>>Вот и мне лениво — поэтому предпочитаю на Пайтоне простые задачи решать. Одна из основных концепций Пайтона — простые вещи должны делаться просто.

V>>Про yield я в курсе. Он и на Пайтоне есть — с точно такой-же функциональностью. Думаю с Пайтона его и собрали в .Net — хотя не уверен.
S>На самом деле на шарпе можно решать любые задачи с той же эффективностью. Учитываю, что большинство использует нетипизированный питон, то на шарпе используя
S>интеллисенс и прочие удобства IDE можно писать даже быстрее.
S> Это уже дело привычки

Ну давай рассмотрим простую задачу — задание пишу вообще от балды — не подстраивая под Пайтон: открыть файл с именами сотрудников и зарплатами, распарсить все строки и выдать имя наиболее высокооплачиваемого работника. Никакие сторонние библиотеки не используем, как и парсеры CSV — иначе это сравнение библиотек, а не языков. Пример файла:
Иванов, 1000
Петров, 2000
Сидоров, 3000

Для простоты считаем, что все строки содержат корректные записи — ошибки обрабатывать не надо.

На Пайтоне я решу задачу не задумываясь так (наверняка есть решения и еще более лаконичные):
employees = []

for line in open("D:\\test.txt", encoding="utf-8").readlines():
    items = line.split(",")
    employees.append((items[0], int(items[1])))

employees.sort(key=lambda i: i[1])
print("Employee with the biggest salary is: ", employees[-1][0])


Это полное решение — не нужны никакие import, не нужен проектный файл — это уже готовый к исполнению файл
На C# я буду вынужден нахреначить минимум втрое больше кода и еще и проект создать для этого:

using System;
using System.IO;    
using System.Collections.Generic;
using System.Text;

public class Program
{
    public static void Main()
    {
        var employes = new List<(string n, int s)>();

        foreach(var line in File.ReadAllLines("D:\test.txt", Encoding.UTF8))
        {
            var items = line.Split(',');
            employes.Add((items[0], Int32.Parse(items[1])));
        }
        
        employes.Sort((i, j) => i.s.CompareTo(j.s));
        Console.WriteLine("Employee with the biggest isalary is: " + employes[employes.Count - 1].n);
    }
}


Кроме кучи лишнего кода, связанного с уровнями доступами, декларациями классов, библиотеками, который мне для простого решения вообще не нужен, еще и сам основной код, получился несколько менее компактным и читабельным. В этом коде можно заметить 2 вещи, в которых Пайтон лучше шарпа. Это парсинг строки к int — в Пайтоне делается так: (int) str. Так же сортировки в Пайтоне поудобнее — не нужен компарер — можно задать ключ. Но это мелочи по сравнению с мусорным для простого проекта декларативным кодом.