{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" }, "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Python 输入输出" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "## 标准输出\n", "通过Python 的内置 **print** 函数就能轻松实现终端上的输出" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World\n" ] } ], "source": [ "print(\"Hello World\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "?print()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "def print(self, *args, sep=' ', end='\\n', file=None): \n", " \n", " print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n", " \n", " Prints the values to a stream, or to sys.stdout by default.\n", " Optional keyword arguments:\n", " file: a file-like object (stream); defaults to the current sys.stdout.\n", " sep: string inserted between values, default a space.\n", " end: string appended after the last value, default a newline.\n", " flush: whether to forcibly flush the stream.\n", " pass" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", " *args 非关键字可变长参数,可以接受任意个参数,参数之间用逗号“,”分隔\n", " sep='' 默认参数,打印参数与参数之间默认有空格\n", " end=‘\\n’ 默认参数,打印后字符串结尾默认会换行。" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "那么接下来,让我们来看看怎么使用吧:\n", "\n", "这里我往print里面传入了很多数字,每一个数字都是一个参数,每一个参数都要用逗号 **“,”** 隔开了。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 1 2 3 4 5\n" ] } ], "source": [ "print(0,1,2,3,4,5)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "字符串也是一样的,字符串用引号包含(“ ”/‘ ’)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "liangxiansen lixiaojie zhaoguifei liuaiqing\n" ] } ], "source": [ "print('liangxiansen','lixiaojie','zhaoguifei','liuaiqing')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "如果我在print里面写 1+1 呢?" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "print(1+1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "接下来,如果我传入一个列表呢?" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 23, 'liang', 'xian', 'sen']\n" ] } ], "source": [ "list_1 = [1,23,'liang','xian','sen']\n", "print(list_1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "列表当做一个参数传递进去,一次打印出来,所以显示list得形式。\n", "\n", "我不想要list的形式,就想要里面的每一个元素的内容呢?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 23 liang xian sen " ] } ], "source": [ "for n in list_1:\n", " print(n,end=\" \")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "因为print默认会在结尾加 “\\n” 换行符,我们想显示在一行,可以将默认参数 end 赋值为 “ ” 空格。\n", "\n", "还有一个很简单的形式, 使用 “*” 星号也一样可以遍历列表中的每个元素。" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 23 liang xian sen\n" ] } ], "source": [ "print(*list_1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 命名规则\n", "\n", "- 变量只能包含字母、数字和下划线。变量名可以以字母或下划线开始,但不能以数字开始。\n", "- 在变量名称不能有空格,所以我们可以用下划线代替空格。例如,使用student_name代替“学生姓名”。\n", "- 你也不能使用[Python关键字](https://docs.python.org/3/reference/lexical_analysis.html#keywords)\n", "- 变量名应该是描述性的,而且不宜太长。例如\"mc_wheels\"和“wheels”来表示number_of_wheels_on_a_motorycle。\n", "- 格外小心使用小写字母l和大写字母O的地方他们可能会与数字1和0混淆。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "liangxiansen 18\n" ] } ], "source": [ "# 单词之间下划线\n", "user_name = 'liangxiansen'\n", "user_age = 18\n", "\n", "print(user_name, user_age)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "liangxiansen 18\n" ] } ], "source": [ "# 驼峰命名规则\n", "UserName = 'liangxiansen'\n", "UserAge = 18\n", "\n", "print(UserName, UserAge)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 格式化输出\n", "像上面输出都在一行,没有什么阅读性,我们可以使用格式化输出:\n", "\n", "Python的字符串格式化有两种方式: 百分号方式、format方式\n", "\n", "百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### \"%\" 百分号格式化\n", "\n", "> %[(name)][flags][width].[precision]typecode\n", "\n", "**(name)** 可选,用于选择指定的key\n", "\n", "**flags** 可选,可供选择的值有:\n", "- \\+, 右对齐;正数前加正好,负数前加负号;\n", "- \\-, 左对齐;正数前无符号,负数前加负号;\n", "- 空格, 右对齐;正数前加空格,负数前加负号;\n", "- 0, 右对齐;正数前无符号,负数前加负号;用0填充空白处\n", "\n", "**width** 可选,占有宽度\n", "\n", "**.precision** 可选,小数点后保留的位数" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**typecode** 必选\n", "- s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置\n", "- r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置\n", "- c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置\n", "- o,将整数转换成 八 进制表示,并将其格式化到指定位置\n", "- x,将整数转换成十六进制表示,并将其格式化到指定位置\n", "- d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置\n", "- e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)\n", "- E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)\n", "- f,将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)\n", "- F,同上\n", "- g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)\n", "- G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)\n", "- %,当字符串中存在格式化标志时,需要用 %%表示一个百分号" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Infomation of user 'liangxiansen':\n", "-------------------\n", "Name: liangxiansen\n", "Age : 18\n", "Job : programmer\n", "---------End-------\n", "\n" ] } ], "source": [ "name = \"liangxiansen\"\n", "age = 18\n", "job =\"programmer\"\n", "\n", "msg = \"\"\"\n", "Infomation of user %r:\n", "-------------------\n", "Name: %s\n", "Age : %d\n", "Job : %s\n", "---------End-------\n", "\"\"\"\n", " \n", "print(msg % (name, name, age, job))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "接下来具体介绍 **typecode** 都有哪些用法:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'My name is liangxiansen.'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"My name is %s.\" % name" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "通过上面的几个例子可以看到 “%” 百分号那个位置都被字符串 % 后面的变量所替代了\n", "\n", "事实上,使用百分号的格式就是这样:\n", "\n", "你需要被格式化的字符串 % 需要用来格式化的元素,如果是多个,用括号包住。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "\"My name is liangxiansen, I'm 18 years old.\"" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"My name is %s, I'm %d years old.\" % (name, age)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**%s** —— 获取传入对象的str方法的返回值,并将其格式化到指定位置\n", "\n", "**%d** —— 将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'percent: 99.88%'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"percent: %.2f%%\" % 99.87557" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**.precision** —— 可选,小数点后保留的位数\n", "\n", "**%f** —— 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'percent: 9.987557e+01%'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'percent: 9.987557E+01%'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"percent: %e%%\" % 99.87557\n", "\"percent: %E%%\" % 99.87557" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**%e** —— 将整数、浮点数转换成科学计数法,并将其格式化到指定位置\n", "\n", "**%E** —— 将整数、浮点数转换成科学计数法,并将其格式化到指定位置" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'oct nummber: 121'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'hex number: 51'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"oct nummber: %o\" % 81\n", "\"hex number: %x\" % 81" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**%o** —— 将整数转换成 八 进制表示,并将其格式化到指定位置\n", "\n", "**%x** —— 将整数转换成十六进制表示,并将其格式化到指定位置" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "接下来看看非必须标记符,怎么辅助必须标记符 **typecode** 实现不同的工作:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Infomation of user liangxiansen:\n", "-------------------\n", "Name: liangxiansen\n", "Age : 18\n", "Job : programmer\n", "---------End-------\n", "\n" ] } ], "source": [ "msg1 = \"\"\"\n", "Infomation of user %(name)s:\n", "-------------------\n", "Name: %(name)s\n", "Age : %(age)d\n", "Job : %(job)s\n", "---------End-------\n", "\"\"\"\n", "\n", "print(msg1 % {\"name\": name, \"age\": age, \"job\": job})" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "当在很大一长串字符串里面需要格式格式化的地方特别多的时候,你写很多%s ,%d ... 等,然后再最后需要格式化的时候,需要在 %( ) 里面写一大堆内容,而且要排序对应好往里面添加的时候是不是感觉特别不友好,很容易出问题,对应不上整个内容就出更期望的不一样了,如果数据类型和字符串中的标识位不一样将会程序出错。\n", "\n", "**For example:**" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "TypeError", "evalue": "%d format: a number is required, not str", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m