C#程序员学习 Python

孙广东  2016.1.1

交互:

C# 执行Python代码:

http://stackoverflow.com/questions/11779143/run-a-python-script-from-c-sharp

反着来:

http://stackoverflow.com/questions/3260015/run-a-c-sharp-application-from-python-script


Python语言的特点:
高级语言
内置电池(大量的标准库)
解释型(有时JIT编译)
面向对象(尤其是Python 3)
强类型动态语义
语法强调可读性
支持重用通过模块和包

Python程序的“形状” :
    Python定义代码块(在Python中使用 空格 和 冒号)。



看一个 Demo:

import random

def get_days():
    # List<string> days = new List<sting>();
    # days[]
    days = ['mon','tues','wed','thurs','fri','sat','sun']
    return days

def get_random_report():
    weather = ['sunny', 'lovely','cold']
    return weather[ random.randint(0, len(weather) - 1)]

def main():
    days = get_days()

    for day in days:
        report = get_random_report()
        print("On {0} it will be {1}.".format(day, report))

if __name__ == "__main__":
    main()

C# 都有什么呢?


一、 Everything is an object (一切皆对象)

C# :

class Document: object
{
    public void Serialize()
    {
        // ...
    }

    public override string ToString()
    {
        return "I am a document ";
    }
}

Python:

class Document(object):
    def serialize(self):
        print("太好了!")

    def __str__(self):
        return "I am a document."


二、IEnumerable + foreach loops

C# :

        int[] numbers = new[] {1, 2, 3, 4, 5, 6};
        foreach (var n in numbers)
        {
            Console.Write(n + ",");
        }
class ShoppingCart : IEnumerable<Tuple<string, float>>
{
    List<Tuple<string, float>>  cartItems = new List<Tuple<string, float>>();

    public void Add(string name, float price)
    {
        cartItems.Add(new Tuple<string, float>(name, price));
    }

    public IEnumerator<Tuple<string, float>> GetEnumerator()
    {
        return cartItems.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return cartItems.GetEnumerator();
    }
}


Python :

numbers = [1, 2, 3, 4, 5, 6]

for n in numbers:
    print(n, end=',')
for v in enumerate(numbers):
    print(v, end=',')
for index, k in enumerate(numbers):
    print(k, end=',')
class CarItem:
    def __init__(self, name, price):
        self.price = price
        self.name = name

    def __repr__(self):
        return "({0}, ${1})".format(self.name, self.price)

class ShoppingCart:
    def __init__(self):
        self.__items = []

    def add(self, cart_item):
        self.__items.append(cart_item)

    def __iter__(self):
        return self.__items.__iter__()

print()
print()

cart = ShoppingCart()
cart.add(CarItem("CD", 19.99))
cart.add(CarItem("Record", 17.99))

for item in cart.items:
    print(item)



三、Properties (int Age {get; set;})

C# :

    class ShoppingCart
    {
        List<Tuple<string, float>> cartItems = new List<Tuple<string, float>>();

        public float TotalPrice
        {
            get
            {
                float total = 0;
                foreach (var item in cartItems)
                {
                    total += item.Item2;
                }
                return total;
            }
        }
    }

Python :

class ShoppingCart:
    @property
    def total_price(self):
        total = 0.0
        for item in self.__items:
            total += item.price
        return total

print("Total price is ${0:,}".format(cart.total_price))


四、Anonymous types (匿名类型)

C#:

    public static void Main(String[] args)
    {
        var o = new
        {
            Id = 2,
            Registered = true
        };

        Console.WriteLine(o);

        if (o.Registered)
        {
            Console.WriteLine("They are registered...");
        }
    }

python:

class AnonObject(dict):
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__

person = {
    "name": "Michael",
    "age": 40
}
anonPerson = AnonObject(name = "Michael", age=40)

print(anonPerson)
print(anonPerson["name"])
print(anonPerson.name)
print(anonPerson.age)

五、Lambda expressions

C#:

    private static IEnumerable<int> FindNumbers(Predicate<int> predicate)
    {
        for (int i = 0; i < 100; i++)
        {
            if (predicate(i))
            {
                yield return i;
            }
        }
    }

    private IEnumerable<int> nums = FindNumbers(n => n%11 == 0);
    // [0, 11,22,33,44,55,66,77,88,99]

python:

def get_numbers(limit, predicate):
    for n in range(0, limit):
        if predicate(n):
            yield n

def divide_by_ll(n):
    return n % 11 == 0

output = list(get_numbers(40, divide_by_ll))
print(output)
def get_numbers(limit, predicate):
    for n in range(0, limit):
        if predicate(n):
            yield n

# def divide_by_ll(n):
#     return n % 11 == 0

output = list(get_numbers(40,lambda n : n % 11 ==0 ))
print(output)



六、NuGET package management



七、Entity Framework 》ORMs



八、ASP.NET MVC



九、LINQ

C# :

        var older =
            from p in people 
            where p.age > 30
            orderby p.age descending 
            select new { age = p.age, name = p.name }

python:

class Person:
    def __init__(self, name, age, hobby):
        self.hobby = hobby
        self.name = name
        self.age = age

    def __repr__(self):
        return "{0} is {1} and likes {2}".format(self.name, self.age, self.hobby)

class AnonObject(dict):
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__

people = [
    Person("Jeff", 50, "Biking"),
    Person("Michael", 40, "Biking"),
    Person("Saerh", 30, "Running"),
    Person("Tony", 24, "Jogging"),
    Person("Zoe", 12, "TV"),
]

bikers = [
    AnonObject(Name = p.name, PastTime = p.hobby)
    for p in people
    if p.hobby == "Biking"
]
bikers.sort(key=lambda p:p.Name)

for b in bikers:
    print(b)


十、Iterator methods / yield return

C#:

    private static IEnumerable<int> FibonacciGenerator()
    {
        int current = 1;
        int next = 1;

        yield return current;
        while (true)
        {
            int temp = current + next;
            current = next;
            next = temp;
            yield return current;
        }
    }

python:

def fibinnoci():
    current = 0
    nxt = 1

    while True:
        current, nxt = nxt, current + nxt
        #print("Generating" + str(current))
        yield  current

for n in fibinnoci():
    if n > 200:
        break

    print(n, end=', ')
    # 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,


十一、JIT compilation












  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#程序员书籍推荐 1、C#编程 C# Windows Form 程序设计------对熟练掌握WinForm编程基础比较有用,看得时候建议将书中的例子从头到尾做一遍,这样会有比较好的收获,否则,学习效果一般。 C# XML从入门到精通 ------这本书前半部分讲的关于XML的基础操作比较有用,后半部分如果对XML有兴趣的话也可以仔细看看,毕竟XML是现在的一个主流方向。 C#高级编程 ------大家公认的一本C#经典教课书,但是太厚了,要有耐心仔细看下去,不然效果就不是很好。 说明:个人认为看编程的书就要敲代码,如果将书中的例子做一遍,只看书,效果会大大折扣的,尤其对于刚开始学习编程的人。 2、代码质量 重构-改善既有代码的结构 ------一本与设计模式齐名的经典著作,对你的代码规范、代码质量以及软件设计都有很大的帮助。 个体软件过程 ------一本偏重于软件工程的书,也许你会觉得很无聊,但是如果坚持下来,你会觉得效果真的就如书上所说。我只坚持了一个月,但是感觉收获已经很大。 说明:软件代码质量和个人的编码习惯、编码风格有很大关系,当水平达到一定之后,你的编码习惯、编码风格如果有问题的话,会阻碍你的进一步提高的。编码风格、编码习惯的改进中再坚持。 3、设计思想 UML与模式应用 ------我看到的第一本让我佩服的书,也是OO方面我的启蒙书,这本书我看了三遍,笔记记了一大堆,每次都有新的收获,而且最近还计划在仔细阅读一遍! 设计模式 可复用的软件设计基础------一本计算机界公认的经典著作,这本书对于入门者可能有点困难,但是这本书看十遍都不多!绝对的经典!如果以后想做软件开发的话,个人建议将这本书看五遍以上! 面向对象编程导论(原书第3版)------一本对OO讲述比较全面、比较经典的书籍。 说明:设计思想方面,OO是现在的主流,东西很灵活,要多看相关的书籍,多在实践中运用。同时,看着部分的书,一定静下心来人真看。 4、软件工程 应用极限编程-积极求胜 ------极限编程现在很火,也是你无法全部接受它,或者你周围的环境不能实施它,但是其中的一些思想、最佳实践可以用在你的工作中,无论是编码还是设计,对你的思路都回有很大好处的! RUP导论 ------RUP和XP是现在很火的东西了,这本书对RUP进行了很好的描述,书很薄,但是能够让你很好的全面地认识RUP。 用例 通过背景环境获得需求------用例分析是RUP中很重要的一个环节,这本书讲的很好,无论在需求分析、软件设计方面都会对你有很大启发。 说明:软件工程现在门类很多,可能很多东西我们周围没有使用的环境,或许我们不会从事软件过程管理,但是其中的很多思想对我们个人的软件开发都会有很大的帮助! 5、软件测试 软件测试的艺术 ------可以帮你纠正很多对软件测试的误区! 单元测试之道 C#版-使用NUnit-----NUnit可是被誉为.net程序员必备的一项工具啊!很不错的一本书,值得仔细看看! 测试驱动开发 ------经典的书籍,虽然是XP中核心的内容之一,但是即使单独运用它,也会给你意外的惊喜。 说明:软件测试并不只是手工点点按钮,其实内容很多的。好的测试员,不仅需要对测试领域有深刻的理解,也需要很高的编程功底。即使你不想从事测试工作,学习这些东西,也会对你的编程水平、代码质量有很大的帮助。 个人认为,看一本书,尤其是经典的著作,看十遍都不为过。同时,看书的过程还要学会发现在其感兴趣的、不了解的内容,然后自己再找相关的书籍看。以上的书只是我看过的、个人认为比较经典的书籍,可能个人情况不一样,兴趣点不一样,对我来说经典的书籍不一定对大家经典,但是,要学会自己查资料、学东西的能力,这才是最重要的。如果你能有毅力用一年或者一年半的时间把上面的书籍吃透,再加上公司项目的锻炼,那恭喜你,你的编程和设计能力在你们同学之中肯定可以稳居前10%。 读书,尤其是软件方面的书,其实是很累的,可能读一本书不累,但是如果你能每天坚持三个小时认认真真地看书,能够将一本经典之作认认真真读五遍,而且一直认认真真,那你的毅力真地令人佩服,同时,你的汗水带给你的会是很多的惊喜! 首先让自己喜欢读书,然后学会读书,再学会自己找书读,自己查资料、解决问题……
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值