{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 编程入门01:Python基础语法\n", "现在让我们从基础概念开始逐步探索Python的语法,编程语言包含多种指令,其中最基本的是“表达式”(Expression),表达式有特定的“值”(Value),例如:1就是一个最简单的表达式,它的值就是1,当你在交互模式下输入1,计算机会返回这个表达式的值1。使用“运算符”(Operator)可以将多个单一表达式组成复合表达式,例如:1+1,Python中的数学运算符除了加减乘除(```+-*/```)外还有整除(```//```)取余(```%```)和乘方(```**```),运算顺序遵循数学规则,括号可以改变运算顺序,但注意一律使用小括号。通过这样的层层组合,你可以输入任意数学运算式所对应的表达式,计算机总是会自动计算并返回单一的值。\n", "\n", "\n", "这个单一的值被称为“物件”或“对象”(Object),对象是一个非常关键的概念,你很快就会发现在Python中“一切皆对象”。每个对象都存在于计算机的内存空间,拥有唯一的编号和确定的类型,你可以用id(对象)来查看它的编号(所在的内存地址),用type(对象)来查看它的类型(所属的“类”名称):\n", "```\n", ">>> id(1)\n", "1756786144\n", ">>> id(5%2)\n", "1756786144\n", ">>> id(2)\n", "1756786176\n", ">>> type(1)\n", "<class 'int'>\n", ">>> type(2)\n", "<class 'int'>\n", ">>> id(1.0)\n", "2705425373944\n", ">>> type(1.0)\n", "<class 'float'>\n", "```\n", "\n", "你可以看到1是整数类型(int),带有小数点的1.0则是浮点类型(float),浮点类型用于表示实数。其实我们还接触过字符串类型(str),在任意长度的字符序列前后加上引号就定义了一个字符串,字符串支持加法(通过连接生成新字符串)和乘法(通过重复生成新字符串):\n", "```\n", ">>> \"你好\"\n", "'你好'\n", ">>> \"你好\"+\"世界!\"\n", "'你好世界!'\n", ">>> \"你好世界!\"*3\n", "'你好世界!你好世界!你好世界!'\n", ">>> type(\"你好世界!\"*3)\n", "<class 'str'>\n", "```\n", "\n", "和数学中一样,你可以用“变量”(Variable)来代表某个数值,这称为变量“赋值”(Assign),变量名可以使用字母(区分大小写)、数字(但不能以数字开头)和下划线,也可以使用任何全角字符包括所有汉字(但建议不要用全角字符)。变量不能和Python语言的关键字重名,否则执行时会报语法错误,你可以输入help(\"keywords\")查看关键字列表。变量赋值语句的基本写法是:变量名=表达式,注意“=”应该读作“赋值”(Python中的等于号是==),一个变量也就是一个单一表达式:\n", "```\n", ">>> x=1\n", ">>> x+2\n", "3\n", ">>> x,y=1,100 # 同时给多个变量赋值\n", ">>> x\n", "1\n", ">>> y\n", "100\n", ">>> x=x+1 # x原值加1再赋值给x\n", ">>> x\n", "2\n", ">>> x+=1 # x原值加1再赋值给x的简洁写法\n", ">>> x\n", "3\n", ">>> x,y=y,x # 对调两个变量所指的对象,其他编程语言基本都需要三条指令才能实现这个操作……\n", ">>> x\n", "100\n", ">>> y\n", "3\n", ">>> type(x)\n", "<class 'int'>\n", ">>> x=\"你好世界!\"\n", ">>> type(x)\n", "<class 'str'>\n", "```\n", "\n", "你可以让两个变量指向同一个对象,也可以用del语句删除已有的变量:\n", "```\n", ">>> y=x # 两个变量指向了同一个对象\n", ">>> id(x)\n", "2565766974768\n", ">>> id(y)\n", "2565766974768\n", ">>> dir() # 查看当前名称空间的变量\n", "['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x', 'y']\n", ">>> del y # 删除已有变量\n", ">>> dir()\n", "['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']\n", ">>> 类型=type # 汉字也可以用做变量名\n", ">>> 类型(x)\n", "<class 'str'>\n", ">>> 类型(id)\n", "<class 'builtin_function_or_method'>\n", ">>> 类型(类型)\n", "<class 'type'>\n", "```\n", "\n", "现在你可能会猜到了,这些id(1)、type(1),还有我们已经接触过的print(\"Hello World!\")也属于复合表达式,id、type、print也是指向某个对象的变量,这种对象是可以做“调用”(Call)运算的,在Python中分为“函数”(function)、“方法”(method)和“类型”(type)等类型,相当于数学中函数的概念。函数名就相当于运算符,参加运算的表达式放在函数名之后的括号里,称为“参数”(Argument),如果有多个参数就用逗号分隔,而运算的结果就是函数的返回值。例如max函数可以从多个数中找出最大值:\n", "```\n", ">>> max\n", "<built-in function max>\n", ">>> max(1,3,9,2)\n", "9\n", ">>> type(max)\n", "<class 'builtin_function_or_method'>\n", ">>> type(max(1,3,9,2))\n", "<class 'int'>\n", "```\n", "\n", "函数能完成各种复杂的功能。例如之前看到的input函数,可以接受一个字符串参数,执行时会显示此字符串作为提示,然后将用户在按回车键之前输入的全部内容作为字符串返回,也可以写成不带参数的input(),执行时就不显示任何提示。print函数同样可以不带参数,这将输出一个空行;也可以带任意多个参数,这将输出以空格分隔的多个值。注意:print函数输出的内容并不是它的返回值,print函数无返回值——或者可以说print函数返回值为“空”,Python专门定义了一个关键字None来代表空值(类型为NoneType),当返回值为空时不显示任何东西,如果你想强制输出空值,可以print(None):\n", "```\n", ">>> None\n", ">>> print(None)\n", "None\n", ">>> print(1,2,3)\n", "1 2 3\n", ">>> print(print(1,2,3)) # 内层print输出三个参数的值,外层print输出内层print返回的空值\n", "1 2 3\n", "None\n", "```\n", "\n", "总而言之,Python语言中的变量就是贴在对象上的标签,所以它还有一个更笼统的叫法——标识符(Identifier)。变量没有确定的类型,它所指向的对象有确定的类型。在Python关键字以外的任何名称例如print也就是一个指向具体对象的变量而已,你完全可以把它指向别的对象(当然不建议这样做):\n", "```\n", ">>> p=print # p和print都指向同一个函数对象\n", ">>> p(x)\n", "你好世界!\n", ">>> print=10 # print指向一个整数对象了\n", ">>> print(x) # 如果尝试调用运算,会提示类型错误“int对象是不能调用的”\n", "Traceback (most recent call last):\n", " File \"<pyshell#54>\", line 1, in <module>\n", " print(x)\n", "TypeError: 'int' object is not callable\n", "```\n", "\n", "——编程原来是这样……\n", "\n", "## 编程小提示:Python解释器的源码\n", "官方Python解释器是用C语言编写的,称为CPython,你可以在这里查看CPython的源代码 https://github.com/python/cpython \n", "如果你想知道所有内建函数是怎样实现的,可以打开这个C文件,例如其中的builtin_print函数就对应Python中的print函数 https://github.com/python/cpython/blob/master/Python/bltinmodule.c\n", "\n", "下一篇:[编程入门03:Python模块与库](03_module.ipynb)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }