10天学习python_学习python3还需要学习python2吗 - CSDN
  • 话说,520情人节啥的跟咱程序员有关系吗?都慌着干啥呢,不用学Python的吗? 哈哈哈,大家视情况而定哈,没对象的...Python100天学习教程(Python学习视频_Python学习路线):Day01 初识Python Python简介 Python的...

    话说,520情人节啥的跟咱程序员有关系吗?都慌着干啥呢,不用学Python的吗?
    哈哈哈,大家视情况而定哈,没对象的赶紧跟唐唐一起学Python100天学习教程吧!
    今天起唐唐会跟大家出系统的Python100天专题课程和习题,100天从新手到大神,你也可以!
    Python100天学习教程(Python学习视频_Python学习路线):Day01 初识Python

    Python简介

    Python的历史

    1. 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。
    2. 1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面又出现了Java和C#实现的版本Jython和IronPython,以及PyPy、Brython、Pyston等其他实现),可以调用C语言的库函数。在最早的版本中,Python已经提供了对“类”,“函数”,“异常处理”等构造块的支持,同时提供了“列表”和“字典”等核心数据类型,同时支持以模块为基础的拓展系统。
    3. 1994年1月:Python 1.0正式发布。
    4. 2000年10月16日:Python
      2.0发布,增加了实现完整的垃圾回收,提供了对Unicode的支持。与此同时,Python的整个开发过程更加透明,社区对开发进度的影响逐渐扩大,生态圈开始慢慢形成。
    5. 2008年12月3日:Python
      3.0发布,它并不完全兼容之前的Python代码,不过因为目前还有不少公司在项目和运维中使用Python 2.x版本,所以Python 3.x的很多新特性后来也被移植到Python 2.6/2.7版本中。

    目前我们使用的Python 3.7.x的版本是在2018年发布的,Python的版本号分为三段,形如A.B.C。其中A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(如修复了某个Bug),只要有修改就增加C。如果对Python的历史感兴趣,可以查看一篇名为《Python简史》的博文。

    Python的优缺点

    Python的优点很多,简单的可以总结为以下几点。

    1. 简单和明确,做一件事只有一种方法。
    2. 学习曲线低,跟其他很多语言相比,Python更容易上手。
    3. 开放源代码,拥有强大的社区和生态圈。
    4. 解释型语言,天生具有平台可移植性。
    5. 支持两种主流的编程范式(面向对象编程和函数式编程)都提供了支持。
    6. 可扩展性和可嵌入性,可以调用C/C++代码,也可以在C/C++中调用Python。
    7. 代码规范程度高,可读性强,适合有代码洁癖和强迫症的人群。

    Python的缺点主要集中在以下几点。

    1. 执行效率稍低,因此计算密集型任务可以由C/C++编写。
    2. 代码无法加密,但是现在的公司很多都不是卖软件而是卖服务,这个问题会被淡化。
    3. 在开发时可以选择的框架太多(如Web框架就有100多个),有选择的地方就有错误。

    Python的应用领域

    目前Python在云基础设施、DevOps、网络爬虫开发、数据分析挖掘、机器学习等领域都有着广泛的应用,因此也产生了Web后端开发、数据接口开发、自动化运维、自动化测试、科学计算和可视化、数据分析、量化交易、机器人开发、图像识别和处理等一系列的职位。

    搭建编程环境

    Windows环境

    可以在Python官方网站下载到Python的Windows安装程序(exe文件),需要注意的是如果在Windows 7环境下安装需要先安装Service Pack 1补丁包(可以通过一些工具软件自动安装系统补丁的功能来安装),安装过程建议勾选“Add Python 3.6 to PATH”(将Python 3.6添加到PATH环境变量)并选择自定义安装,在设置“Optional Features”界面最好将“pip”、“tcl/tk”、“Python test suite”等项全部勾选上。强烈建议使用自定义的安装路径并保证路径中没有中文。安装完成会看到“Setup was successful”的提示,但是在启动Python环境时可能会因为缺失一些动态链接库文件而导致Python解释器无法运行,常见的问题主要是api-ms-win-crt*.dll缺失以及更新DirectX之后导致某些动态链接库文件缺失,前者可以参照《api-ms-win-crt*.dll缺失原因分析和解决方法》一文讲解的方法进行处理或者直接在微软官网下载Visual C++ Redistributable for Visual Studio 2015文件进行修复,后者可以下载一个DirectX修复工具进行修复。

    Linux环境

    Linux环境自带了Python 2.x版本,但是如果要更新到3.x的版本,可以在Python的官方网站下载Python的源代码并通过源代码构建安装的方式进行安装,具体的步骤如下所示。

    安装依赖库(因为没有这些依赖库可能在源代码构件安装时因为缺失底层依赖库而失败)。

    yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
    

    下载Python源代码并解压缩到指定目录。

    wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
    xz -d Python-3.7.3.tar.xz
    tar -xvf Python-3.7.3.tar
    

    切换至Python源代码目录并执行下面的命令进行配置和安装。

    cd Python-3.7.3
    ./configure --prefix=/usr/local/python37 --enable-optimizations
    make && make install
    

    修改用户主目录下名为.bash_profile的文件,配置PATH环境变量并使其生效。

    cd ~
    vim .bash_profile
    # ... 此处省略上面的代码 ...
    
    export PATH=$PATH:/usr/local/python37/bin
    
    # ... 此处省略下面的代码 ...
    source .bash_profile
    

    MacOS环境

    MacOS也是自带了Python 2.x版本的,可以通过Python的官方网站提供的安装文件(pkg文件)安装3.x的版本。默认安装完成后,可以通过在终端执行python命令来启动2.x版本的Python解释器,可以通过执行python3命令来启动3.x版本的Python解释器。

    从终端运行Python程序

    确认Python的版本

    在终端或命令行提示符中键入下面的命令。

    python --version
    

    当然也可以先输入python进入交互式环境,再执行以下的代码检查Python的版本。

    import sys
    
    print(sys.version_info)
    print(sys.version)
    

    编写Python源代码

    可以用文本编辑工具(推荐使用Sublime、Atom、TextMate、VSCode等高级文本编辑工具)编写Python源代码并将其命名为hello.py保存起来,代码内容如下所示。

    print('hello, world!')
    

    运行程序

    切换到源代码所在的目录并执行下面的命令,看看屏幕上是否输出了"hello, world!"。

    python hello.py
    

    代码中的注释

    注释是编程语言的一个重要组成部分,用于在源代码中解释代码的作用从而增强程序的可读性和可维护性,当然也可以将源代码中不需要参与运行的代码段通过注释来去掉,这一点在调试程序的时候经常用到。注释在随源代码进入预处理器或编译时会被移除,不会在目标代码中保留也不会影响程序的执行结果。

    1. 单行注释 - 以#和空格开头的部分
    2. 多行注释 - 三个引号开头,三个引号结尾
    """
    第一个Python程序 - hello, world!
    向伟大的Dennis M. Ritchie先生致敬
    
    Version: 0.1
    Author: 骆昊
    """
    
    print('hello, world!')
    # print("你好,世界!")
    print('你好', '世界')
    print('hello', 'world', sep=', ', end='!')
    print('goodbye, world', end='!\n')
    

    其他工具介绍

    IDLE - 自带的集成开发工具

    IDLE是安装Python环境时自带的集成开发工具,如下图所示。但是由于IDLE的用户体验并不是那么好所以很少在实际开发中被采用。

    在这里插入图片描述

    IPython - 更好的交互式编程工具

    IPython是一种基于Python的交互式解释器。相较于原生的Python Shell,IPython提供了更为强大的编辑和交互功能。可以通过Python的包管理工具pip安装IPython和Jupyter,具体的操作如下所示。

    pip install ipython jupyter
    

    或者

    python -m pip install ipython jupyter
    安装成功后,可以通过下面的ipython命令启动IPython,如下图所示。
    在这里插入图片描述
    当然我们也可以通过Jupyter运行名为notebook的项目在浏览器窗口中进行交互式操作。jupyter notebook
    在这里插入图片描述
    anaconda - 一站式的数据科学神器

    Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包,Anaconda 的下载文件比较大(约 531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。 对于学习数据科学的人来说,anaconda是绝对的神器,安装简便,而且anaconda支持安装相关软件【例如前文提到的ipython,jupyter notebook,甚至有R等其他数据科学软件 】 一个相当有价值的介绍 现在唯一的问题在于清华镜像服务已经关闭,跨国下载会比较慢

    Sublime - 文本编辑神器
    在这里插入图片描述

    • 首先可以通过官方网站下载安装程序安装Sublime 3或Sublime 2。
    • 安装包管理工具。

    通过快捷键Ctrl+`或者在View菜单中选择Show Console打开控制台,输入下面的代码。

    Sublime 3

    import  urllib.request,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
    

    Sublime 2

    import  urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp)ifnotos.path.exists(ipp)elseNone;urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read());print('Please restart Sublime Text to finish installation')
    

    手动安装浏览器输入 https://sublime.wbond.net/Package Control.sublime-package
    下载这个文件 下载好以后,打开sublime text,选择菜单Preferences->Browse Packages… 打开安装目录
    此时会进入到一个叫做Packages的目录下,点击进入上一层目录Sublime Text3,在此目录下有一个文件夹叫做Installed
    Packages,把刚才下载的文件放到这里就可以了。然后重启sublime
    text3,观察Preferences菜单最下边是否有Package Settings 和Package
    Control两个选项,如果有,则代表安装成功了。

    • 安装插件。通过Preference菜单的Package
      Control或快捷键Ctrl+Shift+P打开命令面板,在面板中输入Install
      Package就可以找到安装插件的工具,然后再查找需要的插件。

    我们推荐大家安装以下几个插件:

    • SublimeCodeIntel - 代码自动补全工具插件。
    • Emmet - 前端开发代码模板插件。
    • Git - 版本控制工具插件。
    • Python PEP8 Autoformat - PEP8规范自动格式化插件。
    • ConvertToUTF8 - 将本地编码转换为UTF-8。
    • PyCharm - Python开发神器

    PyCharm的安装、配置和使用我们在后面会进行介绍。
    在这里插入图片描述
    Gitpod - 一键式在线开发工具

    只需单击即可在GitHub上打开任何Python项目。

    练习

    1. 在Python交互环境中查看下面的代码结果,并将内容翻译成中文。

      import this

      Beautiful is better than ugly.
      Explicit is better than implicit.
      Simple is better than complex.
      Complex is better than complicated.
      Flat is better than nested.
      Sparse is better than dense.
      Readability counts.
      Special cases aren’t special enough to break the rules.
      Although practicality beats purity.
      Errors should never pass silently.
      Unless explicitly silenced.
      In the face of ambiguity, refuse the temptation to guess.
      There should be one-- and preferably only one --obvious way to do it.
      Although that way may not be obvious at first unless you’re Dutch.
      Now is better than never.
      Although never is often better than right now.
      If the implementation is hard to explain, it’s a bad idea.
      If the implementation is easy to explain, it may be a good idea.
      Namespaces are one honking great idea – let’s do more of those!

    2. 学习使用turtle在屏幕上绘制图形。

      import turtle

      turtle.pensize(41)
      turtle.pencolor(‘red’)
      turtle.forward(100)
      turtle.right(90)
      turtle.forward(100)
      turtle.right(90)
      turtle.forward(100)
      turtle.right(90)
      turtle.forward(100)
      turtle.mainloop()

    嘱咐一句哈,Python学习课程后的练习一定更要尝试着做,巩固的作用!

    展开全文
  • 点击上方“程序IT圈”,选择“置顶公众号”每天早晨8点50分,准点开车打卡来自:开源最前线综合自:https://github.com/jackfrued/Python-...
        
    点击上方“程序IT圈”,选择“置顶公众号”
    每天早晨8点50分,准点开车打卡

    640?wx_fmt=gif

    来自:开源最前线

    综合自:https://github.com/jackfrued/Python-100-Days


    Python是一种很棒的编程语言。学习曲线低,即便你没有任何基础也可以快速上手,而且背后拥有一个强大的生态系统


    下图显示了主要城市Python招聘需求量及薪资待遇排行榜。


    640?wx_fmt=png


    由此可见,Python整体的薪资水平还是相当可观,既然学习曲线低,薪资也还过得去,为何不选择Python作为我们下一个学习的语言呢?


    此前曾经和大家分享过一个名叫100-Days-Of-ML-Code的机器学习项目,100天学会机器学习,今天猿妹要和大家再分享一个Python项目,帮助你100天拿下Python,这个项目叫 —— Python-100-Days


    在GitHub Trending榜单中,仅次于微软前几日发布的命令行工具 Terminal:


    640?wx_fmt=png


    目前,Python-100-Days在GitHub上获得 21030 个Star,6953个fork。(GitHub地址:https://github.com/jackfrued/Python-100-Days


    创建者将100天的任务细分如下:

    • Day01~15 - Python语言基础

    • Day16~20 - Python语言进阶

    • Day21~30 - Web前端入门

    • Day31~35 - 玩转Linux操作系统

    • Day36~40 - 数据库基础和进阶

    • Day41~55 - 实战Django

    • Day56~60 - 实战Flask

    • Day61~65 - 实战Tornado

    • Day66~75 - 爬虫开发

    • Day76~90 - 数据处理和机器学习

    • Day91~100 - 团队项目开发



    以下是 Day 1-Day 48的详细内容:


    640?wx_fmt=jpeg

    640?wx_fmt=png

    640?wx_fmt=png

    640?wx_fmt=png

    640?wx_fmt=png

    640?wx_fmt=png

    640?wx_fmt=png


    可以看出每一天作者都安排了2-10个知识点供开发者学习,任务安排适当,每天安排两个小时差不多,如果你对Python感兴趣,可以试试这个项目。

    https://github.com/jackfrued/Python-100-Days


    ~完~


    打卡赠书:坚持30天打卡赠书新玩法!

    送什么书?请点击左下角阅读原文查看!


    签到方式:长按以下二维码参与打卡↓↓↓↓↓


    640?wx_fmt=png


    640?

    我的知识星球,限时免费加入!

    收藏这份IntelliJ IDEA使用技巧大全

    教你巧记OSI七层网络模型(个人总结)

    HashMap底层的数据结构和算法

    详解 Spring AOP 的实现机制

    十二张图详解Redis的数据结构和对象系统

    五分钟彻底理解一致性哈希算法

    我们为什么要使用 AOP ?

    TCP/IP的底层队列实现原理

    强烈推荐款下载不限速解析神器

    源码解析Java字符串比较


    640?wx_fmt=png

    强烈推荐↓↓↓

    640?wx_fmt=png


    展开全文
  • 编者按:本书节选自图书《Python与机器学习实战》,Python本身带有许多机器学习的第三方库,但本书在绝大多数情况下只会用到Numpy这个基础的科学计算库来进行算法代码的实现。这样做的目的是希望读者能够从实现的...

    编者按:本书节选自图书《Python与机器学习实战》,Python本身带有许多机器学习的第三方库,但本书在绝大多数情况下只会用到Numpy这个基础的科学计算库来进行算法代码的实现。这样做的目的是希望读者能够从实现的过程中更好地理解机器学习算法的细节,以及了解Numpy的各种应用。不过作为补充,本书会在适当的时候应用scikit-learn这个成熟的第三方库中的模型。

    “机器学习”在最近虽可能不至于到人尽皆知的程度,却也是非常火热的词汇。机器学习是英文单词“Machine Learning”(简称ML)的直译,从字面上便说明了这门技术是让机器进行“学习”的技术。然而我们知道机器终究是死的,所谓的“学习”归根结底亦只是人类“赋予”机器的一系列运算。这个“赋予”的过程可以有很多种实现,而Python正是其中相对容易上手、同时性能又相当不错的一门语言。本文打算先谈谈机器学习相关的一些比较宽泛的知识,再介绍并说明为何要使用Python来作为机器学习的工具。最后,我们会提供一个简短易懂的、具有实际意义的例子来给大家提供一个直观的感受。

    具体而言,本章主要涉及的知识点有:

    • 机器学习的定义及重要性;
    • Python在机器学习领域的优异性;
    • 如何在电脑上配置Python机器学习的环境;
    • 机器学习一般性的步骤。

    机器学习绪论

    正如前言所说,由于近期的各种最新成果,使得“机器学习”成为了非常热门的词汇。机器学习在各种领域的优异表现(围棋界的Master是其中最具代表性的存在),使得各行各业的人们都或多或少地对机器学习产生了兴趣与敬畏。然而与此同时,对机器学习有所误解的群体也日益壮大;他们或将机器学习想得过于神秘,或将它想得过于万能。本节拟对机器学习进行一般性的介绍,同时会说明机器学习中一些常见的术语以方便之后章节的叙述。

    什么是机器学习

    清晨的一句“今天天气真好”、朋友之间的寒暄“你刚刚是去吃饭了吧”、考试过后的感叹“复习了那么久终有收获”……这些日常生活中随处可见的话语,其背后却已蕴含了“学习”的思想—它们都是利用以往的经验、对未知的新情况作出的有效的决策。而把这个决策的过程交给计算机来做,可以说就是“机器学习”的一个最浅白的定义。

    我们或许可以先说说机器学习与以往的计算机工作样式有什么不同。传统的计算机如果想要得到某个结果,需要人类赋予它一串实打实的指令,然后计算机就根据这串指令一步步地执行下去。这个过程中的因果关系非常明确,只要人类的理解不出偏差,运行结果是可以准确预测的。但是在机器学习中,这一传统样式被打破了:计算机确实仍然需要人类赋予它一串指令,但这串指令往往不能直接得到结果;相反,它是一串赋予了机器“学习能力”的指令。在此基础上,计算机需要进一步地接受“数据”,并根据之前人类赋予它的“学习能力”,从中“学习”出最终的结果。这个结果往往是无法仅仅通过直接编程得出的。因此这里就导出了稍微深一点的机器学习的定义:它是一种让计算机利用数据而非指令来进行各种工作的方法。在这背后,最关键的就是“统计”的思想,它所推崇的“相关而非因果”的概念是机器学习的理论根基。在此基础上,机器学习可以说是计算机使用输入给它的数据,利用人类赋予它的算法得到某种模型的过程,其最终的目的则是使用该模型,预测未来未知数据的信息。

    既然提到了统计,那么一定的数学理论就不可或缺。相关的、比较简短的定义会在第4章给出(PAC框架),这里我们就先只叙述机器学习在统计理论下的、比较深刻的本质:它追求的是合理的假设空间(Hypothesis Space)的选取和模型的泛化(Generalization)能力。该句中出现了一些专用术语,详细的定义会在介绍术语时提及,这里我们提供一个直观的理解:

    • 所谓的假设空间,就是我们的模型在数学上的“适用场合”。
    • 所谓的泛化能力,就是我们的模型在未知数据上的表现。

    注意:上述本质上严格来说,应该是PAC Learning的本质;在其余的理论框架下,机器学习是可以具有不同的内核的。

    从上面的讨论可以看出,机器学习和人类思考的过程有或多或少的类似。事实上,我们在第6、第7章讲的神经网络(Neural Network,NN)和卷积神经网络(Convolutional Neural Network,CNN)背后确实有着相应的神经科学的理论背景。然而与此同时需要知道的是,机器学习并非是一个“会学习的机器人”和“具有学习能力的人造人”之类的,这一点从上面诸多讨论也可以明晰(惭愧的是,笔者在第一次听到“机器学习”四个字时,脑海中浮现的正是一个“聪明的机器人”的图像,甚至还幻想过它和人类一起生活的场景)。相反的,它是被人类利用的、用于发掘数据背后信息的工具。

    当然,现在也不乏“危险的人工智能”的说法,霍金大概是其中的“标杆”,这位伟大的英国理论物理学家甚至警告说“人工智能的发展可能意味着人类的灭亡”。孰好孰坏果然还是见仁见智,但可以肯定的是:本书所介绍的内容绝不至于导致世界的毁灭,大家大可轻松愉快地进行接下来的阅读!

    机器学习常用术语

    机器学习领域有着许多非常基本的术语,这些术语在外人听来可能相当高深莫测。它们事实上也可能拥有非常复杂的数学背景,但需要知道:它们往往也拥有着相对浅显平凡的直观理解(上一小节的假设空间和泛化能力就是两个例子)。本小节会对这些常用的基本术语进行说明与解释,它们背后的数学理论会有所阐述,但不会涉及过于本质的东西。

    正如前文反复强调的,数据在机器学习中发挥着不可或缺的作用;而用于描述数据的术语有好几个,需要被牢牢记住的如下。

    • “数据集”(Data Set),就是数据的集合的意思。其中,每一条单独的数据被称为“样本”(Sample)。若没有进行特殊说明,本书都会假设数据集中样本之间在各种意义下相互独立。事实上,除了某些特殊的模型(如隐马尔可夫模型和条件随机场),该假设在大多数场景下都是相当合理的。
    • 对于每个样本,它通常具有一些“属性”(Attribute)或者说“特征”(Feature),特征所具体取的值就被称为“特征值”(Feature Value)。
    • 特征和样本所张成的空间被称为“特征空间”(Feature Space)和“样本空间”(Sample Space),可以把它们简单地理解为特征和样本“可能存在的空间”。
    • 相对应的,我们有“标签空间”(Label Space),它描述了模型的输出“可能存在的空间”;当模型是分类器时,我们通常会称之为“类别空间”。

    其中、数据集又可以分为以下三类:

    • 训练集(Training Set);顾名思义,它是总的数据集中用来训练我们模型的部分。虽说将所有数据集都拿来当作训练集也无不可,不过为了提高及合理评估模型的泛化能力,我们通常只会取数据集中的一部分来当训练集。
    • 测试集(Test Set);顾名思义,它是用来测试、评估模型泛化能力的部分。测试集不会用在模型的训练部分,换句话说,测试集相对于模型而言是“未知”的,所以拿它来评估模型的泛化能力是相当合理的。
    • 交叉验证集(Cross-Validation Set,CV Set);这是比较特殊的一部分数据,它是用来调整模型具体参数的。

    注意:需要指出的是,获取数据集这个过程是不平凡的;尤其是当今“大数据”如日中天的情景下,诸如“得数据者得天下”的说法也不算诳语。在此笔者推荐一个非常著名的含有大量真实数据集的网站:http://archive.ics.uci.edu/ml/ datasets.html,本书常常会用到其中一些合适的数据集来评估我们自己实现的模型。

    可以通过具体的例子来理解上述概念。比如,我们假设小明是一个在北京读了一年书的学生,某天他想通过宿舍窗外的风景(能见度、温度、湿度、路人戴口罩的情况等)来判断当天的雾霾情况并据此决定是否戴口罩。此时,他过去一年的经验就是他拥有的数据集,过去一年中每一天的情况就是一个样本。“能见度”、“温度”、“湿度”、“路人戴口罩的情况”就是四个特征,而(能见度)“低”、(温度)“低”、(湿度)“高”、(路人戴口罩的)“多”就是相对应的特征值。现在小明想了想,决定在脑中建立一个模型来帮自己做决策,该模型将利用过去一年的数据集来对如今的情况做出“是否戴口罩”的决策。此时小明可以用过去一年中8个月的数据量来做训练集、2个月的量来做测试集、2个月的量来做交叉验证集,那么小明就需要不断地思考(训练模型)下列问题:

    • 用训练集训练出的模型是怎样的?
    • 该模型在交叉验证集上的表现怎么样?
      • 如果足够好了,那么思考结束(得到最终模型)。
      • 如果不够好,那么根据模型在交叉验证集上的表现,重新思考(调整模型参数)。

    最后,小明可能会在测试集上评估自己刚刚思考后得到的模型的性能,然后根据这个性能和模型做出的“是否戴口罩”的决策来综合考虑自己到底戴不戴口罩。

    接下来说明上一小节中提到过的重要概念:假设空间与泛化能力。泛化能力的含义在上文也有说明,为强调起见,这里再叙述一遍:

    • 泛化能力针对的其实是学习方法,它用于衡量该学习方法学习到的模型在整个样本空间上的表现。

    这一点当然是十分重要的,因为我们拿来训练模型的数据终究只是样本空间的一个很小的采样,如果只是过分专注于它们,就会出现所谓的“过拟合”(Over Fitting)的情况。当然,如果过分罔顾训练数据,又会出现“欠拟合”(Under Fitting)。可以用一张图来直观地感受过拟合和欠拟合(如图1所示,左为欠拟合,右为过拟合)。

    图片描述

    图1 欠拟合与过拟合

    所以需要“张弛有度”,找到最好的那个平衡点。统计学习中的结构风险最小化(Structural Risk Minimization,SRM)就是研究这个的,它和传统的经验风险最小化(Empirical Risk Minimization,ERM)相比,注重于对风险上界的最小化,而不是单纯地使经验风险最小化。它有一个原则:在使风险上界最小的函数子集中挑选出使经验风险最小的函数。而这个函数子集,正是我们之前提到过的假设空间。

    注意:所谓经验风险,可以理解为训练数据集上的风险。相对应的,ERM则可以理解为只注重训练数据集的学习方法,它的理论基础是经验风险在某种足够合理的数学意义上一致收敛于期望风险,亦即所谓的“真正的”风险。

    关于SRM和ERM的详细讨论会涉及诸如VC维和正则化的概念,这里不进行详细展开,但需要有这么一个直观的认识:为了使我们学习方法训练出的模型泛化能力足够好,需要对模型做出一定的“限制”,而这个“限制”就表现在假设空间的选取上。一个非常普遍的做法是对模型的复杂度做出一定的惩罚,从而使模型趋于精简。这与所谓的“奥卡姆剃刀原理”不谋而合:“如无必要,勿增实体”“切勿浪费较多的东西去做,用较少的东西、同样可以做好事情”。

    相比起通过选取合适的假设空间来规避过拟合,进行交叉验证(Cross Validation)则可以让我们知道过拟合的程度,从而帮助我们选择合适的模型。常见的交叉验证有以下三种。

    • S-fold Cross Validation:中文可翻译成S折交叉验证,它是应用最多的一种方法,其方法大致如下。
      • 将数据分成S份:D={D_1,D_2,…,D_S},一共做S次试验。
      • 在第i次试验中,使用D-D_i作为训练集,D_i作为测试集对模型进行训练和评测。
      • 最终选择平均测试误差最小的模型。
    • 留一交叉验证(Leave-one-out Cross Validation):这是S折交叉验证的特殊情况,此时S=N。
    • 简易交叉验证:这种实现起来最简单,也是本书(在进行交叉验证时)所采用的方法。它简单地将数据进行随机分组,最后达到训练集约占原数据70%的程度(这个比例可以视情况改变),选择模型时使用测试误差作为标准。

    机器学习的重要性

    道理说了不少,但到底为什么要学机器学习,机器学习的重要性又在哪里呢?事实上,回顾历史可以发现,人类的发展通常伴随着简单体力劳动向复杂脑力劳动的过渡。过去的工作基本上都有着明确的定义,告诉你这一步怎么做、下一步再怎么做。而如今这一类的工作已经越来越少,取而代之的是更为宽泛模糊的、概念性的东西,比如说“将本季度的产品推向最合适的市场,在最大化期望利润的同时,尽量做到风险最小化”这种需求。想要完成好这样的任务,需要获取相应的数据;虽说网络的存在让我们能够得到数之不尽的数据,然而从这些数据中获得信息与知识却不是一项简单的工作。我们当然可以人工地、仔细地逐项甄选,但这样显然就又回到了最初的原点。机器学习这门技术,可以说正因此应运而生。

    单单抽象地说一大堆空话可能会让人头昏脑涨,我们就举一举机器学习具体的应用范围,从中大概能够比较直观地看出机器学习的强大与重要。

    发展到如今,机器学习的“爪牙”可谓已经伸展到了各个角落、包括但不限于:

    • 机器视觉,也就是最近机器学习里很火热的深度学习的一种应用;
    • 语音识别,也就是微软Cortana背后的核心技术;
    • 数据挖掘,也就是耳熟能详的大数据相关的领域;
    • 统计学习,也就是本书讲解的主要范围之一,有许许多多著名的算法(比如支持向量机SVM)都源于统计学习(但是统计学习还是和机器学习有区别的;简单地说,统计学习偏数学而机器学习偏实践)。

    机器学习还能够进行模式识别、自然语言处理,等等,之前提到过的围棋界的Master和最新人工智能在德州扑克上的表现亦无不呈现着机器学习强大的潜力。一言以蔽之,机器学习是当今的热点,虽说不能保证它的热度能100%地一直延续下去,至少笔者认为、它能在相当长的一段时间内保持强大的生命力。

    人生苦短,我用Python

    上一节大概地介绍了机器学习的各种概念,这一节我们主要讲讲脚本语言Python相关的一些东西。题目是在Python界流传甚广的“谚语”,它讲述了Python强大的功能与易于上手的特性。

    为何选择Python

    援引开源运动的领袖人物Eric Raymond的说法:“Python语言非常干净,设计优雅,具有出色的模块化特性。其最出色的地方在于,鼓励清晰易读的代码,特别适合以渐进开发的方式构造项目”。Python的可读性使得即使是刚学不久的人也能看懂大部分的代码,Python庞大的社区和大量的开发文档更是使得初学者能够快速地实现许许多多令人惊叹的功能。对于Python的程序,人们甚至有时会戏称其为“可执行的伪代码(executable pseudo-code)”,以突显它的清晰性和可读性。

    Python的强大是毋庸置疑的,上文提到的Eric Raymond甚至称其“过于强大了”。与之相对应的,就是Python的速度比较慢。然而比起Python开发环境提供的海量高级数据结构(如列表、元组、字典、集合等)和数之不尽的第三方库,再加上高速的CPU和近代发展起来的GPU编程,速度的问题就显得没那么尖锐了。况且Python还能通过各种途径使用C / C++代码来编写核心代码,其强大的“胶水”功能使其速度(在程序员能力允许的情况下)和纯粹的C / C++相比已经相去不远。一个典型的例子,也是我们会在本书常常运用到的Python中Numpy这个第三方库。编写它的语言正是底层语言(C和Fortran),其支持向量、矩阵操作的特性和优异的速度,使得Python在科学计算这一领域大放异彩。

    注意:Python及本书用到的两个非常优异的第三方库—Numpy和TensorFlow的简要教程我们会作为附录章节放在本书的最后,建议有需要的读者先阅读相应部分。

    Python 在机器学习领域的优势

    虽然在上一小节叙述了Python的种种好处,但不可否认的是,确实存在诸如MATLAB和Mathematica这样的高级程序语言。它们对机器学习的支持也不错,MATLAB甚至还自带许多机器学习的应用。但是作为一个问心无愧的程序员,我们还是需要提倡支持正版,而MATLAB的正版软件需要花费数千美元。与之相对,由于Python是开源项目,几乎所有必要的组件都是完全免费的。

    之前也提到过Python的速度问题,但是更快更底层的语言,比如C和C++,若使用它们来学习机器学习,会不可避免地引发这么一个问题:即使是实现一个非常简单的功能,也需要进行大量的编写和调试的过程;在这期间,程序员很有可能忘掉学习机器学习的初衷而迷失在代码的海洋中。笔者曾经尝试过将Python上的神经网络框架移植到C++上,这之间的折腾至今难忘。

    此外,笔者认为、使用Python来学习机器学习是和“不要过早优化”这句编程界的金句有着异曲同工之妙的。Python(几乎)唯一的缺陷—速度,在初期进行快速检验算法、思想正误及开发工作时,其实基本上不是重要问题。其中的道理是显而易见的:如果解决问题的思想存在问题,那么即使拼命去提高程序的运行效率,也只能使问题越来越大而已。这种时候,先使用Python进行快速实现,有必要时再用底层代码重写核心代码,从各方面来说都是一个更好的选择。

    关于Anaconda

    Python的强大有相当大一部分体现在它那浩如烟海的第三方库。在使用Python实现一个复杂功能时,如果没有特殊的需求,我们通常会先搜索Google有没有现成的第三方库,然后会搜索是否有相关联的第三方库,最后才会考虑自己重头实现。

    第三方库是如此之多,从中挑选出心仪而合适的并非易事。幸运的是,就连这一点也有第三方软件进行了支持,那就是在Python科学计算领域非常出名的Anaconda。这是一个完全免费的软件,经常会进行各种更新;最重要的是,它把几乎所有常用且优异的科学计算库都集成在了一起。换句话说,只要你安装了Anaconda,就意味着拥有了一个完善精致的机器学习环境,基本上无须自己把要用到的库一个一个通过命令行来安装。

    第一个机器学习样例

    作为本章的总结,我们来运用Python解决一个实际问题,以便对机器学习有一个具体的感受。由于该样例只是为了提供直观感受,我们就拿比较有名的一个小问题来进行阐述。俗话说:“麻雀虽小,五脏俱全”,我们完全可以通过这个样例来对机器学习的一般性步骤进行一个大致的认知。

    该问题来自Coursera上的斯坦福大学机器学习课程,其叙述如下:现有47个房子的面积和价格,需要建立一个模型对新的房价进行预测。稍微翻译问题,可以得知:

    • 输入数据只有一维,亦即房子的面积。
    • 目标数据也只有一维,亦即房子的价格。
    • 需要做的,就是根据已知的房子的面积和价格的关系进行机器学习。

    下面我们就来一步步地进行操作。

    获取与处理数据

    原始数据集的前10个样本如表1.1所示,这里房子面积和房子价格的单位可以随意定夺,因为它们不会对结果造成影响。

    表1.1 房价数据集
    图片描述

    完整的数据集可以参见https://github.com/carefree0910/MachineLearning/blob/master/ _Data/prices.txt。虽然该数据集比较简单,但可以看到其中的数字都相当大。保留它原始形式确实有可能是有必要的,但一般而言,我们应该对它做简单的处理以期望降低问题的复杂度。在这个例子里,采取常用的将输入数据标准化的做法,其数学公式为:

    图片描述

    代码1-1 第一个机器学习样例:a_FirstExample\Regression.py

    01  # 导入需要用到的库
    02  import numpy as np
    03  import matplotlib.pyplot as plt
    04
    05  # 定义存储输入数据(x)和目标数据(y)的数组
    06  x, y = [], []
    07  # 遍历数据集,变量sample对应的正是一个个样本
    08  for sample in open("../_Data/prices.txt", "r"):
    09  # 由于数据是用逗号隔开的,所以调用Python中的split方法并将逗号作为参数传入
    10      _x, _y = sample.split(",")
    11      # 将字符串数据转化为浮点数
    12      x.append(float(_x))
    13      y.append(float(_y))
    14  # 读取完数据后,将它们转化为Numpy数组以方便进一步的处理
    15  x, y = np.array(x), np.array(y)
    16  # 标准化
    17  x = (x - x.mean()) / x.std()
    18  # 将原始数据以散点图的形式画出
    19  plt.figure()
    20  plt.scatter(x, y, c="g", s=6)
    21  plt.show()
    

    上面这段代码的运行结果如图2所示。

    图片描述

    图2 预处理后的数据散点图

    这里横轴是标准化后的房子面积,纵轴是房子价格。以上我们已经比较好地完成了机器学习任务的第一步:数据预处理。

    选择与训练模型

    在弄好数据之后,下一步就要开始选择相应的学习方法和模型了。幸运的是,通过可视化原始数据,可以非常直观地感受到:很有可能通过线性回归(Linear Regression)中的多项式拟合来得到一个不错的结果。其模型的数学表达式如下。

    注意:用多项式拟合散点只是线性回归的很小的一部分,但是它的直观意义比较明显。考虑到问题比较简单,我们才选用了多项式拟合。线性回归的详细讨论超出了本书的范围,这里不再赘述。

    图片描述

    其中f(x|p;n)就是我们的模型,p、n都是模型的参数,其中p是多项式f的各个系数,n是多项式的次数。L(p;n)则是模型的损失函数,这里我们采用了常见的平方损失函数,也就是所谓的欧氏距离(或说向量的二范数)。x、y则分别是输入向量和目标向量;在我们这个样例中,x、y这两个向量都是47维的向量,分别由47个不同的房子面积、房子价格所构成。

    在确定好模型后,就可以开始编写代码来进行训练了。对于大多数机器学习算法,所谓的训练正是最小化某个损失函数的过程,这个多项式拟合的模型也不例外:我们的目的就是让上面定义的L(p;n)最小。在数理统计领域里有专门的理论研究这种回归问题,其中比较有名的正规方程更是直接给出了一个简单的解的通式。不过由于有Numpy的存在,这个训练过程甚至变得还要更加简单一些。

    22  # 在(-2,4)这个区间上取100个点作为画图的基础
    23  x0 = np.linspace(-2, 4, 100) 
    24  # 利用Numpy的函数定义训练并返回多项式回归模型的函数
    25  # deg参数代表着模型参数中的n,亦即模型中多项式的次数
    26  # 返回的模型能够根据输入的x(默认是x0),返回相对应的预测的y
    27  def get_model(deg):
    28      return lambda input_x=x0: np.polyval(np.polyfit(x, y, deg), input_x)
    

    这里需要解释Numpy里面带的两个函数:polyfit和polyval的用法。

    • polyfit(x, y, deg):该函数会返回使得上述图片描述(注:该公式中的x和y就是输入的x和y)最小的参数p,亦即多项式的各项系数。换句话说,该函数就是模型的训练函数。
    • polyval(p, x):根据多项式的各项系数p和多项式中x的值,返回多项式的值y。

    评估与可视化结果

    模型做好后,我们就要尝试判断各种参数下模型的好坏了。为简洁起见,我们采用n=1,4,10这三组参数进行评估。由于我们训练的目的是最小化损失函数,所以用损失函数来衡量模型的好坏似乎是一个合理的做法。

    29  # 根据参数n、输入的x、y返回相对应的损失
    30  def get_cost(deg, input_x, input_y):
    31      return 0.5 * ((get_model(deg)(input_x) - input_y) ** 2).sum()
    32  # 定义测试参数集并根据它进行各种实验
    33  test_set = (1, 4, 10)
    34  for d in test_set:
    35      # 输出相应的损失
    36      print(get_cost(d, x, y))
    

    所得的结果是:当n=1,4,10时,损失的头两位数字分别为96、94和75。这么看来似乎是n=10优于n=4,而n=1最差,但从图3可以看出,似乎直接选择n=1作为模型的参数才是最好的选择。这里矛盾的来源正是前文所提到过的过拟合情况。

    图片描述

    图3 线性回归的可视化

    那么,怎么最直观地了解是否出现过拟合了呢?当然还是画图了。

    37  # 画出相应的图像
    38  plt.scatter(x, y, c="g", s=20)
    39  for d in test_set:
    40      plt.plot(x0, get_model(d)(), label="degree = {}".format(d))
    41  # 将横轴、纵轴的范围分别限制在(-2,4)、(〖10〗^5,8×〖10〗^5)
    42  plt.xlim(-2, 4)
    43  plt.ylim(1e5, 8e5)
    44  # 调用legend方法使曲线对应的label正确显示
    45  plt.legend()
    46  plt.show()
    

    上面这段代码的运行结果如图3所示。

    其中,三条线分别代表n=1、n=4、n=10的情况(图1.10的右上角亦有说明)。可以看出,从n=4开始模型就已经开始出现过拟合现象了,到n=10时模型已经变得非常不合理。

    至此,可以说这个问题就已经基本上解决了。在这个样例里面,除了交叉验证,我们涵盖了机器学习中的大部分主要步骤(之所以没有进行交叉验证是因为数据太少了……)。代码部分加起来总共40~50行,应该算是一个比较合适的长度。希望大家能够通过这个样例对机器学习有个大概的了解,也希望它能引起大家对机器学习的兴趣。

    本章小结

    • 与传统的计算机程序不同,机器学习是面向数据的算法,能够从数据中获得信息。它符合新时代脑力劳动代替体力劳动的趋势,是富有生命力的领域。
    • Python是一门优异的语言,代码清晰可读、功能广泛强大。其最大弱点—速度问题也可以通过很多不太困难的方法弥补。
    • Anaconda是Python的一个很好的集成环境,它能让我们免于人工地安装大量科学计算所需要的第三方库。
    • 虽说机器学习算法很多,但通常而言,进行机器学习的过程会包含以下三步:
      • 获取与处理数据;
      • 选择与训练模型;
      • 评估与可视化结果。

    《Python与机器学习实战》订购链接:
    图片描述


    图片描述

    CSDN AI热衷分享 欢迎扫码关注

    展开全文
  • 转载本文章请标明作者和出处 本文出自《Darwin的程序空间》 能阻止你成功的人,只有你自己...博客目的:总结归纳,当然要能帮助其他刚学习Python的童鞋,不胜荣幸 人物:一个心血来潮学习Python的JAVA程序员 ...

    转载本文章请标明作者和出处
    本文出自《Darwin的程序空间》

    在这里插入图片描述

    能阻止你成功的人,只有你自己

    vlog

    • 时间:2020年02月28日-2020年03月01日 ——————两个白天,一个通宵
    • 学习方式:视频(黑马),博客,百度
    • 完成内容:python基础语法
    • 博客目的:总结归纳,当然要能帮助其他刚学习Python的童鞋,不胜荣幸
    • 人物:一个心血来潮学习Python的JAVA程序员

    正文

    入门基础

    • Python之父:吉多,人生格言:人生苦短,我用Python
    • Python是一门解释型语言
      • 解释型语言
        解释型语言是直接把脚本丢给解释器执行,解释器是跨平台的,所以开发者是不用考虑跨平台问题的;Java、Python都是解释型语言,解释型语言每条语句都是执行到了才翻译的,效率比较低,java在丢给虚拟机(解释器)之前还有一个编译的步骤,.class文件有点像中间语言的意思。
      • 编译型语言
        编译型语言,如C、C++,是直接把源文件编译成机器语言,直接丢给操作系统执行,但是如果是不同的操作系统,所需要的二进制文件是不一样的,所以编译型语言移植操作系统以后,是需要重新编译的。但是因为是直接执行整个机器语言的文件,所以效率会相对解释型语言来说比较快。
    • Python语言的设计哲学
      • 优雅、明确、简单,一版情况下,Python的代码量是Java的1/5
      • python是一门完全面向对象的语言,拥有十分强大的标准库和第三方库
    • 第一次写Python程序须知
      • Python程序其实就是一个特殊格式的文本文件
      • Python文件的拓展名通常是以.py结尾的
      • Python中不能将多行代码写到一行,一行代码只完成一件事情,一行代码写多行,如条件判断很长,使用“\”,Python会当做一行处理
      • Python中是用缩进来代替大括号的,所以不正确的缩进也会报错
      • Python2不支持中文,Python3支持
      • Python3是2008年发布的,并不向下兼容2.*版本;
    • 运行Python程序的方法
      • 使用解释器,python 文件名.py;解释器官方版本是C语言写的,还有其他用JAVA等语言写的解释器版本
      • python shell 交互式
      • ipython 带自动补全和缩进的shell;ipython需要安裝 pip install ipython
      • 集成开发环境,IDE (一般使用pycharm)

    注释

    • Python的注释
      • 单行注释
        • 行首# 加空格加注释内容
        • 代码后空两格加#加空一格加注释内容
      • 多行注释
        • 上下三个双引号或者三个单引号中间加注释

    算数运算符及优先级

    • 算数运算符
      • + 加
      • - 减
      • * 乘 (字符串*一个数字会重复数字对应遍)
      • / 除(9/2=4.5)
      • // 整除 (9//2=4)
      • % 取余(9%2=1)
      • **(幂 2**3=8)
    • 优先级
      • 第一级别 **
      • 第二级别 * / // %
      • 第三级别 + -
      • 高级别的先执行,同级别从左往右执行,括号可以改变执行的顺序

    程序执行原理

    • 计算机三大件

      • CPU:中央处理器,干活的
      • 内存:临时保存数据的,速度特地快,重启数据就没了
      • 硬盘 :永久性存储数据的,速度比较慢
    • 执行原理
      CPU会先把解释器加载到内存中(解释器python2.7的是3.5M),再把程序加载到内存,然后CPU根据解释器去翻译并运行python程序

    变量

    概念和定义方式

    • 变量就是程序在内存中要保存数据而开辟的一小块内存空阿金
    • 使用交互式方式的时候,查看变量的值,直接输入变量名即可,不需要使用print函数;如果通过解释器输出变量的内容的话,需要通过print函数
    • 变量的定义: 变量名 = 值 (不需要声明类型,运行的时候解释器会根据我们数据的内容自动推倒出保存的类型

    变量的命名

    • 变量名由字母、下划线和数字组成
    • 变量名开头不能是数字
    • 变量名不能与关键字重复
      import keyword
      
      print(keyword.kwlist)
      
    • 上面三条不遵守解释器是会报错的
    • 在Python中变量名如果由多个单词组成,我们一般多个单词都是小写然后用下划线隔开 qq_number

    变量的作用域

    Python除了def/class/lambda 外,其他如: if/elif/else/ try/except for/while并不能改变其作用域。定义在他们之内的变量,外部还是可以访问(与JAVA语法不同)

    变量的输入和输出

    • 输入 input函数,可以接受键盘录入的数据
      • 变量名称 = input(“提示信息:”)
      • input输入的内容都是字符串
      • 类型的转换函数
        • int(str) 将字符串转换成int
        • float(str) 将字符串转换成float
        • str(任意类型) 将任意类型转换为字符串
    • 输出 格式化字符串
      • %s代表字符串类型的数据
      • %d输出整数,%06d代表输出整数的位数,不足用0补全,超出6位该是多少就是多少
      • %f输出浮点数,%.02f代表输出小数点后两位
      • %%输出百分号
      • 语法
        • print(“格式化字符串” % 变量1)
        • print(“格式化字符串” % (变量1,变量2,变量3)) 后面的其实就是一个元组

    数据类型

    • 使用type()函数可以查看一个变量的数据类型
    • 数值型的变量是直接可以进行算数运算符的计算的,包括bool型
      • True会当做1
      • False会被当做0
    数值型
    • 整型int ,在Python2.*中是区分int和long型的,在Python3中long型就被取代了,只有int类型
    • 浮点型 float
    • 布尔型 bool
      • 真 True (非0即True)
      • 假 False 0
      • 参与算数运算的时候,True会被当做1,False会被当做0
    • 复数型complex 主要用于科学计算(暂未了解)
    非数值型
    列表
    • 列表是Python中使用最频繁的数据类型
    • 列表用[]定义,数据之间是用,(逗号)隔开
    • 列表用[]定义,数据之间是用,隔开
    • list = [“zhangsan”,“lisi”,“wangwu”]
      list = [] 定义一个空列表
    • list[索引值] 获取元素(切片的一种)
    • 方法
      • 增加
        • list.insert(索引,数据) 在指定的位置插入数据
        • list.append(数据) 在末尾添加数据
        • 列表.extend(列表2) 将列表2的数据追加到列表
          列表 += 列表2 和上面的作用相等
      • 修改
        • 列表[索引] = 数据 修改指定索引下的数据
      • 删除
        • del 列表[索引] 删除指定索引的数据(本质上是将一个变量从内存中删除,不建议使用)
        • 列表.remove[数据] 删除列表中第一个出现的数据
        • 列表.pop() 删除末尾的数据
        • 列表.pop(索引) 删除指定索引的数据
        • 列表.clear() 清空列表
      • 统计
        • len(列表) 列表的长度
        • 列表.count(元素) 统计列表中元素出现的个数
        • 列表.index(元素) 知道元素内容,确定索引
          如果列表中没有这个元素就会报错
      • 排序
        • 列表.sort() 排序、升序
        • 列表.sort()、sort(reverse=True) 排序、降序
        • 列表.reverse() 反转列表
      • 循环遍历

        for 变量名 in 列表:
            循环内部对列表元素的操作
        
    • python中列表可以存储不同数据类型,但是实际开发中我们一般存储相同的数据类型
    元组
    • 元组与列表类似,但是元组的元素不能修改

    • 元组用()定义,中间的元素用,逗号隔开

      • 空元组 empty_tuple = ()
      • 只有一个元素的元组 single_tuple = (元素,)
        只有一个元素,元素后面需要加一个逗号,要不直接就定义的是元素的类型的变量,而不是元组
        (1)是定义了一个int型的1(1,)才是定义了一个元组
    • 元组中通常可以保存不同类型的数据

    • 统计方法

      • len(元组) 元组的长度
      • 元组.count(元素) 统计元组中元素出现的个数
      • 元组.index(元素) 知道元素内容,确定索引
        如果元组中没有这个元素就会报错
    • 循环遍历

      for 变量名 in 元组:
          循环内部对元组元素的操作
      

      在实际开发中,除非能确定元组每个元素的类型,否则不会遍历元组,因为元组保存的元素的数据类型是不同的

    • 元组的应用

      • 当做函数的参数和返回值,可以接受多个参数和返回多个参数
      • 格式化字符串后面的()其实就是一个元组
      • 让列表不被其他人修改,保护列表中数据安全
    列表与元组的互相转换
    • list(元组) 元组转列表
    • tuple(列表) 列表转元组
    字典
    • 字典是除了列表以外最灵活的数据类型,dictionary是无序的对象集合,使用{}来定义
    • 字典使用键值对存储数据,键值对使用逗号进行分隔;
      键和值用:来分隔;
      键必须是唯一的;
      值可以是任何数据类型,但是键只能是元组、字符串或者数字(因为键只能是不可变数据类型,列表和字典是可变型)
    • 定义
      • xiaoming = {“name”:“小明”,“age”:18}
      • xiaoming = {} 定义一个空字典
    • 函数
      • len(字典) 获取字典的键值对数量
      • 字典.keys() 所有key 的列表
      • 字典.values() 所有的值列表
      • 字典.items() 所有的(key,value)元组列表
    • 操作
      • 取值,字典[key值],如果不存在key会报错
      • 增加/修改,字典[key] = value 向字段中新增键值对,如果key不存在是新增,存在就是修改
      • 删除,字典.pop(key) 如果key不存在的话会报错
      • 合并字典,字典1.update(字典2) 将字典2合并到字典1,如果字典2有字典1的键,会将其键值对覆盖
      • 清空字典,字典.clear() 将字典的所有键值对清空
      • 遍历字典
        for key in 字典:
        print("key=%s,value=%s" % (key,字典[key]))
        
    Set
    • set里面存储单个值,且是无序的,不重复的,存入相同的元素会自动去重

    • 定义一个空set:set_1 = set(),因为{}是用来定义空字典的

    • set有值定义

      set_1 = {
          "name",
          "age"
      }
      
    • set 转列表和元组:list(set)、tuple(set)

    • 列表和元组转set:set(列表或元组)

    • set的遍历,和元组、列表的遍历方式一样

      for 元素 in set:
          遍历的操作
      
    • set的运算符操作

      print(set_1 | set_2)  # set1和set2的并集
      print(set_1 & set_2)  # set1和set2的交集
      print(set_1 - set_2)  # set1和set2的差集(set1比set2多的部分)
      print(set_1 ^ set_2)  # set1和set2中不公共存在的元素
      
    字符串
    • 一对单引号或者一对双引号引起来的一串字符叫做字符串

    • 获取字符串里面的字符,可以使用字符串[索引];
      也可以使用for循环遍历

      for char in 字符串:
          print(char)
      
    • 方法

      • len(字符串) 获取这个字符串的长度

      • 字符串.count(字符串1) 获取字符串中子字符串1出出现的次数(如果不存在不会报错)

      • 字符串.index(字符串1)获得小字符串1第一次出现的索引
        (如果不存在会报错)

      • 判断|查找|替换类型的方法

        • string.isspace() 如果string里面只包含制表符或者空格,返回True,空字符串返回False
        • 字符串.startwith(字符串) 判断是否以指定的字符串开始
        • 字符串.endwith(字符串) 判断是否以指定的字符串结束
        • 字符串.find(字符串) 查找包含的字符串,存在的话返回开始的索引,不存在的话返回-1,index方法会操作,这个不会
        • 字符串.replace(旧字符串,新字符串) 替换字符串里面的子字符串,会返回一个新的字符串,原有的字符串不会被修改(str是不可变类型的变量)
      • 文本对齐

        • string.ljust(width) 返回一个元字符串左对齐,并且使用空格填充至长度width的新字符串
        • string.rjust(width) 返回一个元字符串左对齐,并且使用空格填充至长度width的新字符串
        • string.center(width) 返回一个元字符串中间对齐,并且使用空格填充至长度width的新字符串
      • 去除空白字符

        • string.lstrip() 截掉左边的空白字符
        • string.rstrip() 截掉右边的空白字符
        • string.strip() 截掉两边的空白字符
      • 拆分和合并

        • string.split() 把大的字符串拆分成一个字符串列表
        • string.join(序列) 以string为分隔符,将调用方法的字符串当做分隔符,把序列(列表、元组、字典)拼接成一个字符串
      • 拼接方式
        • 两个字符串使用+号进行拼接
        • 一个字符串乘以一个整数可以把这个字符串重复整数次
        • 除此以外,字符串是不能和整数型有任何操作,比如字符串+10就会报错
    在Python中所有非数字型变量都支持的特点
    • 都是一个序列,也可以理解为容器
    • 取值 []
    • 遍历 for in
    • 计算长度len()、最大值max()、最小值min()、删除del()
    • 连接+和重复*(字典没有*)
    • 元素 in 序列 判断元素是否在序列中,字典只针对key
    • 元素 not in 序列 判断元素是否不再序列中,字典只针对key
    • 切片
      • 切片的方法适用于字符串、列表和元组(字典使用的hash是没有顺序的)

      • 字符串[开始索引:结束索引:步长]
        结果不包含结束索引的内容;
        步长指的是切完第一刀,隔几个再切第二个;
        倒序索引-1指的是倒数第一个索引,不包含最后一个,要包含最后一个,结束索引不指定即可;

      • 简书上讲的比较好的博客

      • 习题

        # 字符串的切片  (开始索引:结束索引:步长)
        str_num = "0123456789"
        
        # 截取2-5的字符串
        print(str_num[2:6])
        # 截取2到结束的字符串
        print(str_num[2:])
        # 截取开始到5的字符串
        print(str_num[:6])
        # 截取完整的字符串
        print(str_num[:])
        # 每隔一个截取的字符串
        print(str_num[::2])
        # 截取开始到倒数第二个字符串
        print(str_num[:-1])
        # 截取最后两个字符
        print(str_num[-2:])
        # 字符串倒序
        print(str_num[::-1])
        
        • Python的索引方式
          在这里插入图片描述
      • 查看在内存中的地址 id()

    完整的for循环
    for 变量 in 集合:
        循环代码
    else:
        如果没有通过break跳出循环,循环结束之后会执行的代码
    

    有continue语句也会执行else,只有有break不会执行

    可变数据类型和不可变数据类型
    • 不可变数据类型,内存中的数据不允许被修改(int、float、bool、complex、元组、字符串)
    • 可变数据类型,内存中的数据可以修改(字典和列表)
    • 字典的键只可以是不可变数据类型

    局部变量和全局变量

    • 局部变量是函数内部定义的变量,只能在函数的内部使用;
      全局变量是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量
    • 局部变量在函数执行结束之后会被系统回收,局部变量可以重名
    • 在python中是不允许直接修改全局变量的值的,如果修改,会默认定义了一个与全局变量名称一样的局部变量,如果确实希望对全局变量进行修改,可以声明一下global 变量名,然后在操作变量就是操作的全局变量
    • 如果我们希望在代码中使用全局变量我们一般把全局变量定义到文件的最上方
    • 全局变量的命名一版前面加g_或者gl_
    • 编写代码的顺序
      在这里插入图片描述

    逻辑语句

    • if elif else语句的语法
      if 要判断的条件:
          要输出的语句
      elif 要判断的条件:
          要输出的语句
      else:
          条件不成立的时候,要执行的代码
      
    • 比较运算符
      • == 等于
      • != 不等于 在Python2中不等于还可以使用<>来表示,在Python3中被取消了
      • <= 小于等于
      • >= 大于等于
      • < 小于
      • 大于 >
    • 逻辑运算符
      • and 与,两边都成立才是True
        条件1 and 条件2
      • or 或,两边只要有一个满足就成立
        条件1 or 条件2
      • not 非,对一个条件进行取反
        not 条件1
    • 小游戏石头剪刀布
      • 生成一个0到2的随机数

        import random
        computer = random.randint(0, 2)
        

    循环

    • 程序的三大流程

      • 顺序执行,从上到下
      • 分支,根据条件判断,让程序走特定的分支
      • 循环,让特定的代码重复执行
    • 语法

      初始执行条件,通常是计数器
      while 条件:
          条件满足的时候,需要做的事
          计数器的值的变动
      
    • 死循环

      • 程序员在循环内部忘记修改循环判断条件,导致程序循环执行,无法终止
    • 赋值运算符

      • = 、+=、-=、*=、/=、//=、%=、**=
      • break 跳出当前循环
      • continue 结束本次循环,继续下次循环
      • print函数
        • print函数默认会在末尾加上换行
        • 如果不希望在输出的内容末尾加上换行
          print(“要打印的内容”,end="")

    函数

    • 具有独立功能的小模块,在需要的时候调用

    • 只有在函数定义之后再调用才可以,在一个文件中,调用在上,函数定义在下是会报错的

    • 定义函数,def是定义的意思

      def 函数名():
          函数封装的代码
          ....
      
    • 函数的命名规则和变量的命名规则是相同的

    • 注释

      • 函数的注释应该定义在函数下方,连续使用三个引号
      • 在函数调用的地方,使用ctrl+Q快捷键,可以看到定义的注释
    • 参数

      • 定义

           def 函数名(num1,num2):
            函数封装的代码
            ....
        
      • 形参是在函数小括号内部定义的参数,在函数内部可以当真正的参数使用

      • 实参是调用函数的时候传递的参数

      • 缺省参数

        • 定义函数的时候,可以给某个参数指定一个默认值,如果没有传这个参数,这个参数默认就使用默认值
        • 在参数后面使用赋值语句,就可以指定参数的缺省值;
          def print_info(name,gender=True):
              函数体...
          
        • 缺省参数必须在整个参数列表的末尾,可以末尾有多个缺省参数,调用有多个缺省参数的函数的时候需要指定参数的名称list.sort(reverse=True)
        • 多值参数
          • 参数前增加一个号接收元组,一般参数起名为args
          • 参数前增加两个*接收字典,一般参数起名为**kwargs
          • *agrs和**kwargs同时存在,必须*args在前
          • *agrs后面可以有缺省参数,**kwargs后面不可以有
          • 使用方式
            def test(*args, **kwargs):
                print(args)
                print(kwargs)
            
            
            test(1, 2, 3, 4, name="YH", age=18)
            
          • 拆包
            • 如果直接把一个元组变量和字典变量传递给多值参数,会都被元组接受,解决的方法就是拆包

            • 案例

              def test(*args, **kwargs):
                  print(args)
                  print(kwargs)
              
              
              list = [1, 2, 3]
              map = {"name": "1", "age": 2}
              test(list, map)
              这么传的话*args会包括一个列表元素和一个字典元素长度为2而**kwargs会为空
              

              拆包之后就是正确的

              def test(*args, **kwargs):
                  print(args)
                  print(kwargs)
              
              
              list = [1, 2, 3]
              map = {"name": "1", "age": 2}
              test(*list, **map)
              拆包之后是正确的
              
        • 返回值
          • return 之后的代码都不会执行
          • 调用函数的一方使用变量来接受返回结果
          • 如果函数的返回类型是元组,那么小括号可以省略
          • 交换两个变量的值(利用元组),a,b=b,a
          • 可以使用多个变量来接收返回的元组 gl_1,gl_2 = fun1()
        • python没有函数的重载,也就是你不能定义两个相同名称的参数,哪怕它们的参数列表不同
        • 如果函数返回值是空,直接return,那么它接受返回值的变量is None
        • 递归,自己调用自己

    模块

    • 模块就好比是一个工具包,要想使用这个工具包中的工具,就要导入这个模块;
      每一个以拓展名py结尾的Python源代码文件都是一个模块;
      在模块中定义的全局变量、函数都是模块能提供给外界直接使用的工具
    • 模块名的命名规则和变量的命名规则一样
    • 使用import导入的模块python解释器识别之后会编译成.pyc文件放到项目同级目录__pycache__下,这样导入的文件的内容就可以直接用了,不用一行一行解释

    明信篇管理代码

    在这里插入图片描述

    • cards_main
    """
    名片管理系统V1.0
    """
    import cards_tools
    
    while True:
        cards_tools.welcome_print()
        input_str = input("请输入您的操作: ")
        if input_str in ["1", "2", "3"]:
            if "1" == input_str:
                cards_tools.add_card()
            elif "3" == input_str:
                cards_tools.select_all()
            elif "2" == input_str:
                cards_tools.opera_card()
        elif input_str == "0":
            print("欢迎再次使用名片管理系统,再见~~~")
            break
        else:
            print("您输入的操作有误————请重新选择您的操作")
    
    • cards_tools
    card_list = []
    
    
    def welcome_print():
        """
        名片系统欢迎提示词打印
        """
        print("*" * 50)
        print("欢迎来到名片管理系统V1.0")
        print("输入1: 新增名片")
        print("输入2: 管理名片")
        print("输入3: 查询所有名片")
        print("")
        print("输入0: 退出系统")
        print("*" * 50)
    
    
    def add_card():
        """
        添加名片
        """
        name = input("请输入姓名")
        phone = input("请输入电话")
        age = input("请输入年龄")
        email = input("请输入email地址")
        card_list.append({
            "name": name,
            "phone": phone,
            "age": age,
            "email": email
        })
    
    
    def del_card():
        """
        删除名片
        """
        name = input("请输入您要删除的名片人的名字: ")
        card = select_card(name)
        if card is None:
            return
        else:
            card_list.remove(select_card(name))
    
    
    def opera_card():
        """
        对名片进行操作
        """
        print("输入1: 删除名片")
        print("输入2: 修改名片")
        opera = input("请输入您的对应操作")
        if opera in ["1", "2"]:
            if "1" == opera:
                del_card()
            elif "2" == opera:
                card = select_card(input("请输入您要查询的名片的姓名"))
                if card is None:
                    return
                else:
                    card["name"] = check(card["name"], input("请输入您要修改的名称"))
                    card["phone"] = check(card["phone"], input("请输入您要修改的电话"))
                    card["age"] = check(card["age"], input("请输入您要修改的年龄"))
                    card["email"] = check(card["email"], input("请输入您要修改的邮件地址"))
                    print("修改名片成功")
    
        else:
            print("您的输入有误")
    
    
    def select_card(name):
        """
        根据名称查找名片
        """
        for card in card_list:
            if card["name"] == name:
                return card
        else:
            print("你所查找的<%s>不存在" % name)
        return
    
    
    def select_all():
        """
        查询全部
        """
        if (n := len(card_list)) == 0:
            print("系统内暂无人员")
            return
        else:
            for temp in ["姓名", "电话", "姓名", "邮件"]:
                print(temp, end="\t")
            print("")
            print("=" * 50)
            for card in card_list:
                print("%s\t\t%s\t\t%s\t\t%s" % (card["name"], card["phone"], card["age"], card["email"]))
    
    
    def check(str_opera, input_str):
        """
        校验是否输入
        """
        if len(input_str) == 0:
            return str_opera
        else:
            return input_str
    
    


    喜欢的朋友可以加我的个人微信,我们一起进步
    展开全文
  • 本文转自:Phthon那些事 作为目前最火也是最实用的编程语言,Python不仅是新手入门...究其原因,很可能是没有明确的学习目标,或者学习目标太过“宏伟”,所以总是阵亡在了introduction视频到第一行代码之前。 那...

    本文转自:Phthon那些事

    作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条。

    当然,学Python这件事情,你可能也和文摘菌一样,已经下了一百次决心,但是最后都“从入门到放弃”。

    究其原因,很可能是没有明确的学习目标,或者学习目标太过“宏伟”,所以总是阵亡在了introduction视频到第一行代码之前。

    那么,从小白成为大师,到底需要多长时间?真的有一个有规可循的计划吗?

    本周Github热榜第一的项目告诉你:Python学习有套路!并且只需要100天!

     

    自发布,这篇Github帖子的标星数量已经过万,Fork数量也有3566。项目详细给出了一个100天的Python学习计划,包括每天需要掌握的内容、学习周期、资料库等。从怎么安装Python介绍起到使用Django开发项目收尾,100天,11个阶段,每完成一个阶段都让你成就感满满。

    先附上github地址:

    https://github.com/jackfrued/Python-100-Days

    下面文摘菌也简单介绍一下这个项目。为了激励大家学习,文摘菌还准备了组团打卡免费计划,拉至文末看“团战“福利哦!

    第一阶段,Python语言基础(学习周期15天)

    第1天的任务是让你完成Python的搭建并写出第一行命令,也就是hello word。除此之外,使用IDLE - 交互式环境(REPL),编写多行代码,使用注释给说明代码的作用也是在第一天就要掌握的。

    第2天的任务是掌握Python的语言元素,包括变量和类型、数字和字符串 、运算符等。学完这些知识点,在第二天就要能够实现应用案例包括:华氏温度转换成摄氏温度、输入圆的半径计算周长和面积、输入年份判断是否是闰年。

    例如将华氏温度转摄氏温度。

    """
    将华氏温度转换为摄氏温度
    F = 1.8C + 32
    
    Version: 0.1
    Author: 骆昊
    """
    
    f = float(input('请输入华氏温度: '))
    c = (f - 32) / 1.8
    print('%.1f华氏度 = %.1f摄氏度' % (f, c))

    第3天掌握分支结构,包括分支结构的应用场景,if语句的使用。然后使用这三天的知识点完成案例用户身份验证、英制单位与公制单位互换、掷骰子决定做什么、百分制成绩转等级制、分段函数求值、输入三条边的长度如果能构成三角形就计算周长和面积等。

    第4天学习循环结构,包括while循环的基本结构:break语句、continue语句等。for循环的基本结构、range类型等等。然后完成1~100求和、判断素数、猜数字游戏、打印九九表、打印三角形图案、猴子吃桃等经典案例。

    第5天总结前四天的知识点。

    第6天函数和模块的使用知识点,包括:函数的作用、用函数封装功能模块、定义函数、调用函数、函数的参数、函数的返回值、作用域问题、用模块管理函数。

    第7天,介绍字符串和常用数据结构知识点,包括字符串、列表、元组 、集合、字典等知识点。要能用这些知识带你完成杨辉三角、双色球选号、井字棋等经典案例。

    第8天,面向对象编程基础,介绍类和对象的以及基础练习:定义学生类,定义时钟类,定义图形类,定义汽车类。

    第9天,面向对象进阶,学习属性、类中的方法以及运算符重载、继承和多态等知识点,能够完成工资结算系统、图书自动折扣系统、自定义分数类案例。

    第10天,图形用户界面和游戏开发。使用tkinter开发GUI、使用pygame三方库开发游戏应用,完成打球吃小球的游戏。

    第11天,文件和异常。学会读文件,写文件,异常处理,代码块等知识点,完成案例:歌词解析

    第12天,字符串和正则表达式。重点是正则表达式相关知识点,并能使用正则表达式验证输入的字符串

    第13天,进程和线程,掌握进程和线程的概念、进程的使用方法。

    第14天分为两个部分,第一部分网络编程入门,第二部分网络应用开发。网络编程入门介绍计算机网络基础、网络应用架构、Python网络编程。第二部分介绍访问网络API、文件传输、电子邮件、短信服务(twilio模块 / 国内的短信服务)

    第15天,图像和文档处理。包括用Pillow处理图片,读写Word文档,读写Excel文件,生成PDF文件 等知识点。

    经过这15天,我们就完成了基本的Python语言入门,接下来进入Python语言进阶。

     

    第二阶段,Python语言进阶(周期15天)

    这一阶段要掌握常用数据结构、函数的高级用法(例如Lambda函数、作用域和闭包)、面向对象设计原则、迭代器和生成器、并发和异步编程等五个部分,每两天一个部分!

     

    第三阶段, Web前端入门(周期10天)

    包括:用HTML标签承载页面内容、用CSS渲染页面、用JavaScript处理交互式行为、jQuery入门和提高、Vue.js入门、Element的使用、Bootstrap的使用。

     

    第四阶段,玩转Linux操作系统(周期5天)

    包括操作系统发展史和Linux概述、Linux基础命令、Linux中的实用程序、Linux的文件系统、Vim编辑器的应用、环境变量和Shell编程、软件的安装和服务的配置、网络访问和管理。

     

    第五阶段,数据库基础和进阶(周期5天)

    介绍包括关系型数据库MySQL、SQL的使用以及范式理论,设计二维表的指导思想、数据完整性、数据一致性等相关知识点。最后介绍NoSQL入门。

     

    第六阶段,实战Django(周期15天)

    从第41天开始,就从理论到实践啦!Django实战, 5分钟快速上手,深入模型理解关系数据库配置、使用ORM完成对模型的CRUD操作、Django模型最佳实践;学会加载静态资源、用Ajax请求获取数据。

    这个阶段你还将学到 表单的应用、Cookie和Session、中间件的应用、 日志和缓存、 文件上传和富文本编辑、 文件下载和报表、RESTful架构和DRF入门、 RESTful架构和DRF进阶、 使用缓存、短信和邮件、 异步任务和定时任务、单元测试和项目上线;最后学习项目开发流程和相关工具。

     

    第七阶段,实战Flask(周期5天)

    此阶段掌握:Flask入门、模板的使用、表单的处理、数据库操作、项目实战。

     

    第八阶段,实战Tornado(周期5天)

    在进入正式的知识点之前,先花一天的时间掌握预备知识:并发编程、I/O模式和事件驱动。然后开始学习Tornado入门、异步化、WebSocket的应用等等。

     

    第九阶段,爬虫开发(周期10天)

    包括网络爬虫和相关工具、数据采集和解析、存储数据、并发下载、解析动态内容、表单交互和验证码处理、 Scrapy入门、Scrapy高级应用、Scrapy分布式实现等等。

     

    第十阶段, 数据处理和机器学习(周期15天)

    在工具知识点部分,主要介绍机器学习基础、 Pandas的应用、 NumPy和SciPy的应用、 Matplotlib和数据可视化。在算法部分,主要介绍 k最近邻(KNN)分类、 决策树、 贝叶斯分类、 支持向量机(SVM)、 K-均值聚类、 回归分析。其他也包括:大数据分析入门、 大数据分析进阶、 Tensorflow入门、 Tensorflow实战、推荐系统。

    注:这一部分资料,尚未更新完整。

     

    第十一阶段, 团队项目开发(周期10天)

    开始的前两天, 你需要先组建好开发团队和完成项目选题,数据库设计以及OOAD。

    在之后的6天内,使用Django开发项目;最后给自己留两天的实践测试和部署。

    OMT

     

    学完这100天的知识点,认真完成项目,无论去面试哪一家公司的Python开发岗位,相信你都是信心满满。为了让你尽快拿到offer,此项目还给出了其他的一些资料,包括PEP 8风格指南、Python参考书籍、Python惯例、玩转PyCharm、用函数还是用复杂的表达式、知乎问题回答、那些年我们踩过的那些坑。

     

    例如在知乎问题回答文档中,就给出了Python各个方向的岗位招聘需求情况☟

     

    (完)

    展开全文
  • 初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我...去年圣诞节期间用10天学会python,之后直接上项目,写200行程序那种。最近开始...
  • 小甲鱼老师零基础入门学习Python全套资料百度云(包括小甲鱼零基础入门学习Python全套视频+全套源码+全套PPT课件+全套课后题及Python常用工具包链接、电子书籍等)请往我的资源... 000 愉快的开始 ...
  • 正文开始前,我们先来谈一谈,为什么要学习Python?为什么Python现在这么热门?为什么说Python是现在最热门的语言之一。   首先Python是一个非常适合初学者入门的编程语言。相比较其他不少主流编程语言,有更好的...
  • 自学Python技巧之我们应该怎样学习Python编程?(图) Python已经成为较受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。自从2004年以后,python的使用率呈线性增长。 有人在学习...
  • 内容介绍 在如今这个处处以数据驱动的世界中,机器学习正变得越来越大众化。它已经被广泛地应用于不同领域,如搜索...用最火的 Python 语言、通过各种各样的机器学习算法来解决实际问题! 书中介绍的主要问题如下。 ...
  • 推荐给大家,希望召集更多的朋友一起学习python。 小编有一个群78486745:里面有很多python爱好者讨论学习,有资料,想学python的可以一起加进来,水军勿扰,水军勿扰。 本套教程学习时间15 1-3内容:为Linux...
  • Python:蛇亚目蟒科,主要包括分布于非洲及亚洲的无毒蟒蛇。Python:Richard Clabaugh拍摄的恐怖电影,2000年发行。Python:澳大利亚汽车公司...
  • 微信搜索公众号:学习python的正确姿势,id:fxxkpython,加入pythonner的聚集地! pick up Python 给大家说一下,我要开始学习 Python 了, Python 最近很火嘛(小样,别太膨胀),不过还好我是个程序员,只...
  • “机器学习/深度学习并不需要很多数学基础!”也许你在不同的地方听过不少类似这样的说法。对于鼓励数学基础不好的同学入坑机器学习来说,这句话是挺不错的。不过,机器学习理论是与统计学、概率论、计算机科学、...
  • 我觉得不错的资料我都整理进来了,如果你是学习python的,我觉得这一份资料对你应该有用。1.知乎上超过 10k 的python相关回答Yupeng:三搞定PythonTheAnswer:编程零基础应当如何开始学习 Python?Wayne Shi:...
  • 一位匿名知乎网友回答问题说,用Python写了自动化交易程序,2年躺着赚了200万!相当于普通程序员10年的工资…… ...但是作为一枚小白,在学习Python的时候,免不了要走一定的弯路,还经常会遇到“看了很多的...
  • 大家都知道Python语言是一种新兴的编程语言。1989年,Python就由Guido van Rossum发明。Python一直发展态势很好。  原因有几点:1、跨平台性好。Linux、Windows、MacOS、塞班……。2、快速易学。3、模块齐全。  ...
  • 作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条。 当然,学Python这件事情,你可能也和文摘菌一样,已经下了一百次决心,但是最后都...
1 2 3 4 5 ... 20
收藏数 65,205
精华内容 26,082
关键字:

10天学习python