diff --git "a/2021-11-16-Python\347\274\226\347\250\213\346\225\264\347\220\206.ipynb" "b/2021-11-16-Python\347\274\226\347\250\213\346\225\264\347\220\206.ipynb" new file mode 100644 index 00000000..5ad2a8c1 --- /dev/null +++ "b/2021-11-16-Python\347\274\226\347\250\213\346\225\264\347\220\206.ipynb" @@ -0,0 +1,1896 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python 复习" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "layout:post \n", + "\n", + "tutle: Python 复习\n", + "\n", + "date: 2021-11-14\n", + "\n", + "author: Moon\n", + "\n", + "categories: \n", + "\n", + "|-数据分析部\n", + "\n", + "tags:\n", + "\n", + "|-Python 复习\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.while循环" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1 输出从1加到99的总和" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "总和为: 4950\n" + ] + } + ], + "source": [ + "```python\n", + "n=0\n", + "i=1\n", + "while i<=99:\n", + " n=n+i\n", + " i+=1\n", + "print(\"总和为:\",n)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 输出从1加到用户指定数字的总和" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个整数:3\n", + "1+...+ 3 = 6\n" + ] + } + ], + "source": [ + "#法一 (用while循环)\n", + "a=int(input(\"请输入一个整数:\"))#注意转化为数字类型\n", + "n=0\n", + "i=1\n", + "while i<=a:\n", + " n=n+i\n", + " i+=1\n", + "print('1+...+',a,\"=\",n)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个整数:3\n", + "1+...+ 3 = 6\n" + ] + } + ], + "source": [ + "#法二 (用for in 循环)\n", + "a=int(input(\"请输入一个整数:\"))\n", + "n=0\n", + "for i in range(a):\n", + " n=n+i+1 #range函数为左闭右开区间 所以后面要+1\n", + "print('1+...+',a,\"=\",n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例3 对用户输入的一系列整数求和并计数,当用户输入0,程序结束输入" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个整数:2\n", + "请输入一个整数:3\n", + "请输入一个整数:0\n", + "和为: 5\n" + ] + } + ], + "source": [ + "#if 和 while的结合\n", + "i=int(input('请输入一个整数:'))\n", + "n=0\n", + "while i!=0:\n", + " n=n+i\n", + " i=int(input('请输入一个整数:'))\n", + "print('和为:',n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例4 从键盘接收两个整数,编程求出这两个整数的最大公约数和最小公倍数。(求自最大公约数可用辗转相除法:两个整数的最大公约数等于其中较小者与 较大者对较小者余数 的最大公约数,循环下去,直到余数为零结束,此时的较小者即为最大公约数。)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入两个整数,以逗号分隔:2,3\n", + "zdgys= 1\n", + "zdgbs= 6.0\n" + ] + } + ], + "source": [ + "a,b=eval(input(\"请输入两个整数,以逗号分隔:\"))\n", + "x,y=a,b\n", + "while y!=0:\n", + " m=x%y\n", + " x=y\n", + " y=m\n", + "print(\"zdgys=\",x)\n", + "print(\"zdgbs=\",a*b/x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.if 类题型" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1.按照 1$ = 6¥ 人民币的汇率,编写一个美元和人民币的双向兑换程序,并运行" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入需要转化的货币值(美元以$结尾,人民币以¥结尾:6¥\n", + "6¥转化为美元为:1.00\n", + "6\n", + "6¥\n" + ] + } + ], + "source": [ + "m=input('请输入需要转化的货币值(美元以$结尾,人民币以¥结尾:')\n", + "if m[-1]==\"$\":\n", + " ren=eval(m[0:-1])*6\n", + " print(m+\"转化为人民币为:{:.2f}\".format(ren))\n", + "elif m[-1]==\"¥\":\n", + " mei=eval(m[0:-1])/6\n", + " print(m+\"转化为美元为:{:.2f}\".format(mei))\n", + " print(m[0:-1]) # m[0:1]为左闭右开\n", + " print(m)\n", + "else:\n", + " print('输入无效')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###### 小tips ——str函数能将数值型变量转换成字符串,这样就可以用+连接字符串" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 关于进制转化\n", + "格式化输出65的二进制、八进制、十进制、十六进制的表达形式,及其对应的unicode字符" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "十进制65的二进制为:0B1000001,八进制为0O101,十六进制为:0X41,对应的unicode字符为A \n" + ] + } + ], + "source": [ + "print('十进制{0}的二进制为:0B{0:b},八进制为0O{0:o},十六进制为:0X{0:X},对应的unicode字符为{0:c} '.format(65))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 “回文数\"是一种数字,如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,这个数字就是回文数。编程实现判定输入的任意一个整数是否是回文数。" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入任意整数:987\n", + "987不是回文数\n" + ] + } + ], + "source": [ + "a=str(input('请输入任意整数:'))\n", + "if a==a[::-1]:\n", + " print('{}是回文数'.format(a))\n", + "else:\n", + " print('{}不是回文数'.format(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "789\n" + ] + } + ], + "source": [ + "a=\"987\" \n", + "print(a[::-1]) #[::-1]是翻转" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'python' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpython\u001b[0m \u001b[1;32min\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m\"Python\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"GO\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"C\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"C++\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'python' is not defined" + ] + } + ], + "source": [ + "print(python in [\"Python\", \"GO\", \"C\", \"C++\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'他说:\"你好啊\"。'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sayHi = \"他说:\\\"你好啊\\\"。\"\n", + "sayHi" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m6\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], + "source": [ + "x=(4,5,6)\n", + "x[1] = 10\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例3 用户设置(即输入)密码,要求密码至少8位,而且只能包含字母汉字、数字、下划线,请编程实现密码输入,并判定其是否合法" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入密码:123_13lsmde_13\n", + "密码满足要求\n" + ] + } + ], + "source": [ + "#可以删除_之后再用isalnum()判断\n", + "#isalnum()函数可以判断的字符包括数字、字母、中文字符\n", + "passw=input(\"请输入密码:\")\n", + "if len(passw)<8:\n", + " print(\"密码不合法\")\n", + "else:\n", + " if \"_\" in passw:\n", + " passw=passw.replace(\"_\",\"\")\n", + " if passw.isalnum():\n", + " print(\"密码满足要求\")\n", + " else:\n", + " print(\"密码不满足要求\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. for in 循环" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1(条件中条件)1、完数指一个数恰好等于它的所有因子之和(不包括其本身)。例:6的因子是1,2,3,而6=1+2+3,因此6是完数,编程输出1000之内的所有完数" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n", + "28\n", + "496\n" + ] + } + ], + "source": [ + "for i in range(3,1001):\n", + " n=0\n", + " for v in range(1,i):\n", + " if i%v==0:\n", + " n=n+v\n", + " if n==i: #此处就是与for平级关系\n", + " print(i)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱,用100元钱买100只鸡,有几种方案?分别写出。输出格式为:\n", + "第1组解:公鸡:0 母鸡:25 小鸡:75 \n", + "第2组解:公鸡:4 母鸡:18 小鸡:78 " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "第1组解:公鸡:0 母鸡:25 小鸡:75\n", + "第2组解:公鸡:4 母鸡:18 小鸡:78\n", + "第3组解:公鸡:8 母鸡:11 小鸡:81\n", + "第4组解:公鸡:12 母鸡:4 小鸡:84\n" + ] + } + ], + "source": [ + "s=0\n", + "for x in range(0,21):\n", + " for y in range(0,34):\n", + " if x*5+y*3+(100-x-y)/3==100:\n", + " s=s+1\n", + " print(\"第{}组解:公鸡:{} 母鸡:{} 小鸡:{}\".format(s,x,y,100-x-y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例3 输出10000之内的所有水仙花数。水仙花数是一个n(n>=3)位数,它的每个位上的数字的n次幂之和等于其本身" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "153\n", + "370\n", + "371\n", + "407\n", + "1634\n", + "8208\n", + "9474\n" + ] + } + ], + "source": [ + "for i in range(1,10001): #着重看\n", + " a=str(i)\n", + " b=len(a)\n", + " s=0\n", + " for v in range(0,b):\n", + " s=s+pow(int(a[v]),b)\n", + " if s==i:\n", + " print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例4 编写程序,用户输入一个合数,程序将其分解为质因式输出,如:60=2* 2* 3* 5" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个合数:60\n", + "60=2*2*3*5\n" + ] + } + ], + "source": [ + "n=int(input(\"请输入一个合数:\")) #法一\n", + "s=str(n)+\"=\"\n", + "for i in range(2,n): #i设定为除数\n", + " while n % i==0: #若i除尽n,则i为质因数,重置被除数,连续除i\n", + " s=s+str(i)+\"*\"\n", + " n=n//i #布置下一次的被除数\n", + "print(s[0:-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个合数:60\n", + "因式分解的结果是:60=2*2*3*5\n" + ] + } + ], + "source": [ + "a=int(input(\"请输入一个合数:\")) #法二\n", + "b=2\n", + "c=\"\"\n", + "d=a\n", + "def sushu(n):\n", + " for i in range(2,n):\n", + " if n%i==0:\n", + " break\n", + " else:\n", + " return True\n", + "while b<=a: #如果用for in循环无法让一个数重复\n", + " if a%b==0 and sushu(b):\n", + " c=c+str(b)+\"*\"\n", + " a=a/b\n", + " else:\n", + " b=b+1 \n", + "print('因式分解的结果是:{}={}'.format(d,c[:-1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. 函数" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1 编写实现求一个整数参数的偶数位之和的函数,函数名为evensum。调用该函数,输出整数123456的偶数位的和" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n" + ] + } + ], + "source": [ + "def evensum(n):\n", + " v=str(n)\n", + " m=v[-2::-2]\n", + " a=0\n", + " c=\"\"\n", + " for i in range(len(m)):\n", + " s=int(m[i])\n", + " a=a+s\n", + " return a\n", + "\n", + "print(evensum(123456))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### tips int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 编写函数,实现将二进制字符串转化为10进制数。参数为字符串,返回值为数值。编程实现用户输入二进制数,输出十进制数。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "def f(n):\n", + " s=int(n,2) #int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数\n", + " return s\n", + "print(f('1000'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例3 编写匿名函数,实现:传入一个字符串,返回不包含空格在内的字符的个数。调用匿名函数实现对用户输入的字符串进行上述处理,并输出字符串长度。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入字符串:12ijif jfnc \n", + "字符串长度: 10\n" + ] + } + ], + "source": [ + "process=lambda a:len(a.replace(\" \",\"\"))\n", + "v=input(\"请输入字符串:\")\n", + "print(\"字符串长度:\",process(v))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 异常处理" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例4 实现isNum()函数,参数为一个字符串,如果这个字符串属于整数、浮点数,则返回True,否则返回False。" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def isNum(n): \n", + " try:\n", + " if type(eval(n))in [int, float]: \n", + " return True\n", + " else:\n", + " return False\n", + " except:\n", + " return False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例5 实现isPrime()函数,参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个整数:13\n", + "13 是素数\n" + ] + } + ], + "source": [ + "def isPrime(n):\n", + " try:\n", + " a=int(n)\n", + " for i in range(2,a):\n", + " if a%i==0: #判断素数要把循环全部遍历完再判断\n", + " break\n", + " if i==a-1:\n", + " return True\n", + " else:\n", + " return False\n", + " except: #不在except段直接return False 可以避免输入有误和输入非质数混淆\n", + " print(\"不合法元素\")\n", + " exit(0) #终止程序\n", + "\n", + "y=input(\"请输入一个整数:\")\n", + "if isPrime(y):\n", + " print(y,\"是素数\")\n", + "else:\n", + " print(y,\"不是素数\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例6 编写一个递归函数,实现将十进制数转化为二进制串,并调用该函数。" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10100\n" + ] + } + ], + "source": [ + "def zhuan(x): #法一\n", + " if x==0:\n", + " return \"\" #当商为0时,无需转换,因此返回空\n", + " else:\n", + " z=x%2 #生成余数\n", + " x=x//2 #布置下一次的被除数\n", + " return zhuan(x)+ str(z) #将生成的余数从左边进行连接,符合二进制数生成规律(递归)\n", + "s1=zhuan(20)\n", + "print(s1)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个十进制数:6\n", + "它的二进制为: 110\n" + ] + } + ], + "source": [ + "s=\"\"\n", + "def digui(n):\n", + " global s #声明s为全局变量,则每次函数调用,都可使用和修改s\n", + " x,y=divmod(n,2)#x为商,y为余数\n", + " s=s+str(y)\n", + " if x>=1:\n", + " return digui(x) #商大于等于1时,继续短除法(递归)\n", + " else:\n", + " return s[::-1] #将得到的字符串逆序,以符合二进制数生成规律\n", + "a=eval(input(\"请输入一个十进制数:\"))\n", + "p=digui(a)\n", + "print(\"它的二进制为:\",p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 引用函数" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1 编写程序,利用random库,生成10个随机密码,每个密码固定为10个字符,字符可能是26个小写字母,也可能是10个数字,也可能是!@#¥%^&*8个特殊符号。输出格式为:\n", + "hcnk%xtp \n", + "5c6fltm@ \n", + "*x*8ddz& \n", + "4clc0dbn \n", + "y651qrdx \n", + ".......\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2#q¥k%z*x¥\n", + "7*vlvktm^i\n", + "x64on^@b0t\n", + "7c!t3%dga5\n", + "x5fpkv%q7r\n", + "uhvtyly2b&\n", + "!&bdyk8p4f\n", + "e0@razfnbs\n", + "rgqax5vsl4\n", + "4q#alwd1uf\n" + ] + } + ], + "source": [ + "import random\n", + "v=\"0123456789!@#¥%^&*abcdefghijklmnopqrstuvwxyz\"\n", + "for n in range (0,10):\n", + " password=\"\"\n", + " for i in range(0,10):\n", + " a=random.randint(0,43)\n", + " password=password+v[a]\n", + " print(password) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 编程实现:请验证1000以内的偶数是否符合哥德巴赫猜想。哥德巴赫猜想:任何一个大于等于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6=3+3 \n", + "8=3+5 \n" + ] + } + ], + "source": [ + "def sushu(n):\n", + " for i in range(2,n):\n", + " if n % i == 0:\n", + " break\n", + " if i == n-1:\n", + " return True\n", + " else:\n", + " return False\n", + " \n", + "for m in range(6,10,2):\n", + " for a in range(3,m//2+1): #这里的m一定是m//2+1\n", + " if sushu(a) and sushu(m-a): #不是很懂\n", + " print(\"{}={}+{}\".format(m,a,m-a),end=\" \")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5. 列表" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1 编写程序,接收用户输入的一行由分号“;”分隔的若干个整数,计算这些数的平均数,并且统计有多少个数大于平均数,多少个数小于平均数。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入若干整数,以;分隔1;2;3;4\n", + "平均数为: 2.5\n", + "大于平均数的有2个,小于平均数的有2个\n" + ] + } + ], + "source": [ + "a=list(eval(input(\"请输入若干整数,以;分隔\").replace(\";\",\",\")))\n", + "b=sum(a)/len(a)\n", + "print(\"平均数为:\",b)\n", + "d=x=0\n", + "for item in a:\n", + " if item>b:\n", + " d=d+1\n", + " elif item小tips ——str函数能将数值型变量转换成字符串,这样就可以用+连接字符串 + +*补:<1>关于进制的转化* +*格式化输出65的二进制、八进制、十进制、十六进制的表达形式,及其对应的unicode字符* +```python +print('十进制{0}的二进制为:0B{0:b},八进制为0O{0:o},十六进制为:0X{0:X},对应的unicode字符为{0:c} '.format(65)) +``` +#### 例2 “回文数"是一种数字,如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,这个数字就是回文数。编程实现判定输入的任意一个整数是否是回文数。 +```python +a=str(input('请输入任意整数:')) +if a==a[::-1]: + print('{}是回文数'.format(a)) +else: + print('{}不是回文数'.format(a)) +``` +*补<2>关于翻转* +```python +a="987" +print(a[::-1]) #[::-1]是翻转 +``` +#### 例3 用户设置(即输入)密码,要求密码至少8位,而且只能包含字母汉字、数字、下划线,请编程实现密码输入,并判定其是否合法 +```python +#可以删除_之后再用isalnum()判断 +#isalnum()函数可以判断的字符包括数字、字母、中文字符 +passw=input("请输入密码:") +if len(passw)<8: + print("密码不合法") +else: + if "_" in passw: + passw=passw.replace("_","") + if passw.isalnum(): + print("密码满足要求") + else: + print("密码不满足要求") +``` +### 3. for in 循环 +#### 例1(条件中条件)1、完数指一个数恰好等于它的所有因子之和(不包括其本身)。例:6的因子是1,2,3,而6=1+2+3,因此6是完数,编程输出1000之内的所有完数 +```python +for i in range(3,1001): + n=0 + for v in range(1,i): + if i%v==0: + n=n+v + if n==i: #此处就是与for平级关系 + print(i) +``` +#### 例2 一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱,用100元钱买100只鸡,有几种方案?分别写出。输出格式为: +第1组解:公鸡:0 母鸡:25 小鸡:75 +第2组解:公鸡:4 母鸡:18 小鸡:78 +```python +s=0 +for x in range(0,21): + for y in range(0,34): + if x*5+y*3+(100-x-y)/3==100: + s=s+1 + print("第{}组解:公鸡:{} 母鸡:{} 小鸡:{}".format(s,x,y,100-x-y)) +``` +#### 例3 输出10000之内的所有水仙花数。水仙花数是一个n(n>=3)位数,它的每个位上的数字的n次幂之和等于其本身 +```python +for i in range(1,10001): #着重看 + a=str(i) + b=len(a) + s=0 + for v in range(0,b): + s=s+pow(int(a[v]),b) + if s==i: + print(s) +``` +#### 例4 编写程序,用户输入一个合数,程序将其分解为质因式输出,如:60=2* 2* 3* 5 +```python +n=int(input("请输入一个合数:")) #法一 +s=str(n)+"=" +for i in range(2,n): #i设定为除数 + while n % i==0: #若i除尽n,则i为质因数,重置被除数,连续除i + s=s+str(i)+"*" + n=n//i #布置下一次的被除数 +print(s[0:-1]) +``` +```python +a=int(input("请输入一个合数:")) #法二 +b=2 +c="" +d=a +def sushu(n): + for i in range(2,n): + if n%i==0: + break + else: + return True +while b<=a: #如果用for in循环无法让一个数重复 + if a%b==0 and sushu(b): + c=c+str(b)+"*" + a=a/b + else: + b=b+1 +print('因式分解的结果是:{}={}'.format(d,c[:-1])) +``` +### 4. 函数 +#### 例1 编写实现求一个整数参数的偶数位之和的函数,函数名为evensum。调用该函数,输出整数123456的偶数位的和 +```python +def evensum(n): + v=str(n) + m=v[-2::-2] + a=0 + c="" + for i in range(len(m)): + s=int(m[i]) + a=a+s + return a + +print(evensum(123456)) +``` +>#### tips int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数 +#### 例2 编写函数,实现将二进制字符串转化为10进制数。参数为字符串,返回值为数值。编程实现用户输入二进制数,输出十进制数。 +```python +def f(n): + s=int(n,2) #int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数 + return s +print(f('1000')) +``` +#### 例3 编写匿名函数,实现:传入一个字符串,返回不包含空格在内的字符的个数。调用匿名函数实现对用户输入的字符串进行上述处理,并输出字符串长度。 +```python +process=lambda a:len(a.replace(" ","")) +v=input("请输入字符串:") +print("字符串长度:",process(v)) +``` +*异常处理* +#### 例4 实现isNum()函数,参数为一个字符串,如果这个字符串属于整数、浮点数,则返回True,否则返回False。 +```python +def isNum(n): + try: + if type(eval(n))in [int, float]: + return True + else: + return False + except: + return False +``` +#### 例5 实现isPrime()函数,参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False +```python +def isPrime(n): + try: + a=int(n) + for i in range(2,a): + if a%i==0: #判断素数要把循环全部遍历完再判断 + break + if i==a-1: + return True + else: + return False + except: #不在except段直接return False 可以避免输入有误和输入非质数混淆 + print("不合法元素") + exit(0) #终止程序 + +y=input("请输入一个整数:") +if isPrime(y): + print(y,"是素数") +else: + print(y,"不是素数") +``` +#### 例6 编写一个递归函数,实现将十进制数转化为二进制串,并调用该函数。 +```python +def zhuan(x): #法一 + if x==0: + return "" #当商为0时,无需转换,因此返回空 + else: + z=x%2 #生成余数 + x=x//2 #布置下一次的被除数 + return zhuan(x)+ str(z) #将生成的余数从左边进行连接,符合二进制数生成规律(递归) +s1=zhuan(20) +print(s1) +``` +```python +s="" +def digui(n): + global s #声明s为全局变量,则每次函数调用,都可使用和修改s + x,y=divmod(n,2)#x为商,y为余数 + s=s+str(y) + if x>=1: + return digui(x) #商大于等于1时,继续短除法(递归) + else: + return s[::-1] #将得到的字符串逆序,以符合二进制数生成规律 +a=eval(input("请输入一个十进制数:")) +p=digui(a) +print("它的二进制为:",p) +``` +*补<3>引用函数* +#### 例1 编写程序,利用random库,生成10个随机密码,每个密码固定为10个字符,字符可能是26个小写字母,也可能是10个数字,也可能是!@#¥%^&*8个特殊符号。输出格式为: +hcnk%xtp +5c6fltm@ +*x*8ddz& +4clc0dbn +y651qrdx +....... +```python +import random +v="0123456789!@#¥%^&*abcdefghijklmnopqrstuvwxyz" +for n in range (0,10): + password="" + for i in range(0,10): + a=random.randint(0,43) + password=password+v[a] + print(password) +``` +#### 例2 编程实现:请验证1000以内的偶数是否符合哥德巴赫猜想。哥德巴赫猜想:任何一个大于等于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。 +```python +def sushu(n): + for i in range(2,n): + if n % i == 0: + break + if i == n-1: + return True + else: + return False + +for m in range(6,10,2): + for a in range(3,m//2+1): #这里的m一定是m//2+1 + if sushu(a) and sushu(m-a): #不是很懂 + print("{}={}+{}".format(m,a,m-a),end=" ") + print() +``` +### 5. 列表 +#### 例1 编写程序,接收用户输入的一行由分号“;”分隔的若干个整数,计算这些数的平均数,并且统计有多少个数大于平均数,多少个数小于平均数。 +```python +a=list(eval(input("请输入若干整数,以;分隔").replace(";",","))) +b=sum(a)/len(a) +print("平均数为:",b) +d=x=0 +for item in a: + if item>b: + d=d+1 + elif itemx={1,2,3,4} +x.pop() +#### 例5 编写函数,将一串文本中的辅音字母(去掉元音字母)反序后返回。编写代码,调用该函数。 +```python +def fu(n): + a=input("请输入一串英文文本:") + a=a.replace("a","") + a=a.replace("e","") + a=a.replace("i","") + a=a.replace("o","") + a=a.replace("u","") + a=a.replace("A","") + a=a.replace("E","") + a=a.replace("I","") + a=a.replace("O","") + a=a.replace("U","") + a=a[::-1] + return a +fu(n) +``` +```python +def nixu(s): + h="" + for x in s: + if x in ["a","e","i","o","u","A","E","I","O","U"]: + i=s.index(x) + s=s[0:i]+s[i+1:] + for y in s: + h=y+h + return(h) + +n=input("请输入一段文本:") +print(nixu(n)) +``` +#### 例6 随机生成6行6列的矩阵(每个值都是10~99之间的整数)。求主对角线上元素的乘积,以及副对角线上元素的和。 +```python +a=[] +import random +for j in range(6): + s=[] + for i in range(6): + s.append(random.randint(10,99)) + print(s[i],end=" ") + a.append(s) + print( ) + +v=a[0][0]*a[1][1]*a[2][2]*a[3][3]*a[4][4]*a[5][5] +print(v) +``` +### 6. 集合 +#### 例1 获得用户输入的一个整数N,输出N中所出现不同数字的和。例如:用户输入 123123123,其中所出现的不同数字为:1、2、3,这几个数字和为6。 +```python +N=input("请输入一个整数:") +n=set(N) +v=0 +st="" +for i in n: #对集合中遍历不用range + v=v+int(i) #集合中把字符变成数字 + st=st+"+"+i +print(st[1:],"=",v) +``` +#### 例2 从0到9中随机选择,生成1到10个随机数,这些数字组成集合A。按此方法同样生成集合B。(集合元素个数不定)分别输出A、B集合以及A&B和A|B的结果。 +```python +import random +a=set() +b=set() +for i in range(0,random.randint(1,10)): + a.add(random.randint(0,9)) + b.add(random.randint(0,9)) +print(a) +print(b) +print("a&b:\n",a&b) +print("a|b:\n",a|b) +``` +#### 例3 从0到9中随机选择,生成1到10个随机数,这些数字组成集合A。(集合元素个数不定)。让用户猜集合中的数字,直到全部猜中为止。 +```python +a=set() +import random +for i in range(0,random.randint(1,10)): + a.add(random.randint(0,9)) +print(a) +b=set() +i=0 +while True: #这里为什么用while true + if len(b)\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpython\u001b[0m \u001b[1;32min\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m\"Python\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"GO\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"C\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"C++\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'python' is not defined" + ] + } + ], + "source": [ + "print(python in [\"Python\", \"GO\", \"C\", \"C++\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'他说:\"你好啊\"。'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sayHi = \"他说:\\\"你好啊\\\"。\"\n", + "sayHi" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m6\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mx\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], + "source": [ + "x=(4,5,6)\n", + "x[1] = 10\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例3 用户设置(即输入)密码,要求密码至少8位,而且只能包含字母汉字、数字、下划线,请编程实现密码输入,并判定其是否合法" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入密码:123_13lsmde_13\n", + "密码满足要求\n" + ] + } + ], + "source": [ + "#可以删除_之后再用isalnum()判断\n", + "#isalnum()函数可以判断的字符包括数字、字母、中文字符\n", + "passw=input(\"请输入密码:\")\n", + "if len(passw)<8:\n", + " print(\"密码不合法\")\n", + "else:\n", + " if \"_\" in passw:\n", + " passw=passw.replace(\"_\",\"\")\n", + " if passw.isalnum():\n", + " print(\"密码满足要求\")\n", + " else:\n", + " print(\"密码不满足要求\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. for in 循环" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1(条件中条件)1、完数指一个数恰好等于它的所有因子之和(不包括其本身)。例:6的因子是1,2,3,而6=1+2+3,因此6是完数,编程输出1000之内的所有完数" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n", + "28\n", + "496\n" + ] + } + ], + "source": [ + "for i in range(3,1001):\n", + " n=0\n", + " for v in range(1,i):\n", + " if i%v==0:\n", + " n=n+v\n", + " if n==i: #此处就是与for平级关系\n", + " print(i)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱,用100元钱买100只鸡,有几种方案?分别写出。输出格式为:\n", + "第1组解:公鸡:0 母鸡:25 小鸡:75 \n", + "第2组解:公鸡:4 母鸡:18 小鸡:78 " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "第1组解:公鸡:0 母鸡:25 小鸡:75\n", + "第2组解:公鸡:4 母鸡:18 小鸡:78\n", + "第3组解:公鸡:8 母鸡:11 小鸡:81\n", + "第4组解:公鸡:12 母鸡:4 小鸡:84\n" + ] + } + ], + "source": [ + "s=0\n", + "for x in range(0,21):\n", + " for y in range(0,34):\n", + " if x*5+y*3+(100-x-y)/3==100:\n", + " s=s+1\n", + " print(\"第{}组解:公鸡:{} 母鸡:{} 小鸡:{}\".format(s,x,y,100-x-y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例3 输出10000之内的所有水仙花数。水仙花数是一个n(n>=3)位数,它的每个位上的数字的n次幂之和等于其本身" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "153\n", + "370\n", + "371\n", + "407\n", + "1634\n", + "8208\n", + "9474\n" + ] + } + ], + "source": [ + "for i in range(1,10001): #着重看\n", + " a=str(i)\n", + " b=len(a)\n", + " s=0\n", + " for v in range(0,b):\n", + " s=s+pow(int(a[v]),b)\n", + " if s==i:\n", + " print(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例4 编写程序,用户输入一个合数,程序将其分解为质因式输出,如:60=2* 2* 3* 5" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个合数:60\n", + "60=2*2*3*5\n" + ] + } + ], + "source": [ + "n=int(input(\"请输入一个合数:\")) #法一\n", + "s=str(n)+\"=\"\n", + "for i in range(2,n): #i设定为除数\n", + " while n % i==0: #若i除尽n,则i为质因数,重置被除数,连续除i\n", + " s=s+str(i)+\"*\"\n", + " n=n//i #布置下一次的被除数\n", + "print(s[0:-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个合数:60\n", + "因式分解的结果是:60=2*2*3*5\n" + ] + } + ], + "source": [ + "a=int(input(\"请输入一个合数:\")) #法二\n", + "b=2\n", + "c=\"\"\n", + "d=a\n", + "def sushu(n):\n", + " for i in range(2,n):\n", + " if n%i==0:\n", + " break\n", + " else:\n", + " return True\n", + "while b<=a: #如果用for in循环无法让一个数重复\n", + " if a%b==0 and sushu(b):\n", + " c=c+str(b)+\"*\"\n", + " a=a/b\n", + " else:\n", + " b=b+1 \n", + "print('因式分解的结果是:{}={}'.format(d,c[:-1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. 函数" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1 编写实现求一个整数参数的偶数位之和的函数,函数名为evensum。调用该函数,输出整数123456的偶数位的和" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n" + ] + } + ], + "source": [ + "def evensum(n):\n", + " v=str(n)\n", + " m=v[-2::-2]\n", + " a=0\n", + " c=\"\"\n", + " for i in range(len(m)):\n", + " s=int(m[i])\n", + " a=a+s\n", + " return a\n", + "\n", + "print(evensum(123456))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### tips int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 编写函数,实现将二进制字符串转化为10进制数。参数为字符串,返回值为数值。编程实现用户输入二进制数,输出十进制数。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], + "source": [ + "def f(n):\n", + " s=int(n,2) #int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数\n", + " return s\n", + "print(f('1000'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例3 编写匿名函数,实现:传入一个字符串,返回不包含空格在内的字符的个数。调用匿名函数实现对用户输入的字符串进行上述处理,并输出字符串长度。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入字符串:12ijif jfnc \n", + "字符串长度: 10\n" + ] + } + ], + "source": [ + "process=lambda a:len(a.replace(\" \",\"\"))\n", + "v=input(\"请输入字符串:\")\n", + "print(\"字符串长度:\",process(v))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 异常处理" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例4 实现isNum()函数,参数为一个字符串,如果这个字符串属于整数、浮点数,则返回True,否则返回False。" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def isNum(n): \n", + " try:\n", + " if type(eval(n))in [int, float]: \n", + " return True\n", + " else:\n", + " return False\n", + " except:\n", + " return False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例5 实现isPrime()函数,参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个整数:13\n", + "13 是素数\n" + ] + } + ], + "source": [ + "def isPrime(n):\n", + " try:\n", + " a=int(n)\n", + " for i in range(2,a):\n", + " if a%i==0: #判断素数要把循环全部遍历完再判断\n", + " break\n", + " if i==a-1:\n", + " return True\n", + " else:\n", + " return False\n", + " except: #不在except段直接return False 可以避免输入有误和输入非质数混淆\n", + " print(\"不合法元素\")\n", + " exit(0) #终止程序\n", + "\n", + "y=input(\"请输入一个整数:\")\n", + "if isPrime(y):\n", + " print(y,\"是素数\")\n", + "else:\n", + " print(y,\"不是素数\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例6 编写一个递归函数,实现将十进制数转化为二进制串,并调用该函数。" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10100\n" + ] + } + ], + "source": [ + "def zhuan(x): #法一\n", + " if x==0:\n", + " return \"\" #当商为0时,无需转换,因此返回空\n", + " else:\n", + " z=x%2 #生成余数\n", + " x=x//2 #布置下一次的被除数\n", + " return zhuan(x)+ str(z) #将生成的余数从左边进行连接,符合二进制数生成规律(递归)\n", + "s1=zhuan(20)\n", + "print(s1)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入一个十进制数:6\n", + "它的二进制为: 110\n" + ] + } + ], + "source": [ + "s=\"\"\n", + "def digui(n):\n", + " global s #声明s为全局变量,则每次函数调用,都可使用和修改s\n", + " x,y=divmod(n,2)#x为商,y为余数\n", + " s=s+str(y)\n", + " if x>=1:\n", + " return digui(x) #商大于等于1时,继续短除法(递归)\n", + " else:\n", + " return s[::-1] #将得到的字符串逆序,以符合二进制数生成规律\n", + "a=eval(input(\"请输入一个十进制数:\"))\n", + "p=digui(a)\n", + "print(\"它的二进制为:\",p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 引用函数" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1 编写程序,利用random库,生成10个随机密码,每个密码固定为10个字符,字符可能是26个小写字母,也可能是10个数字,也可能是!@#¥%^&*8个特殊符号。输出格式为:\n", + "hcnk%xtp \n", + "5c6fltm@ \n", + "*x*8ddz& \n", + "4clc0dbn \n", + "y651qrdx \n", + ".......\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2#q¥k%z*x¥\n", + "7*vlvktm^i\n", + "x64on^@b0t\n", + "7c!t3%dga5\n", + "x5fpkv%q7r\n", + "uhvtyly2b&\n", + "!&bdyk8p4f\n", + "e0@razfnbs\n", + "rgqax5vsl4\n", + "4q#alwd1uf\n" + ] + } + ], + "source": [ + "import random\n", + "v=\"0123456789!@#¥%^&*abcdefghijklmnopqrstuvwxyz\"\n", + "for n in range (0,10):\n", + " password=\"\"\n", + " for i in range(0,10):\n", + " a=random.randint(0,43)\n", + " password=password+v[a]\n", + " print(password) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例2 编程实现:请验证1000以内的偶数是否符合哥德巴赫猜想。哥德巴赫猜想:任何一个大于等于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6=3+3 \n", + "8=3+5 \n" + ] + } + ], + "source": [ + "def sushu(n):\n", + " for i in range(2,n):\n", + " if n % i == 0:\n", + " break\n", + " if i == n-1:\n", + " return True\n", + " else:\n", + " return False\n", + " \n", + "for m in range(6,10,2):\n", + " for a in range(3,m//2+1): #这里的m一定是m//2+1\n", + " if sushu(a) and sushu(m-a): #不是很懂\n", + " print(\"{}={}+{}\".format(m,a,m-a),end=\" \")\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5. 列表" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 例1 编写程序,接收用户输入的一行由分号“;”分隔的若干个整数,计算这些数的平均数,并且统计有多少个数大于平均数,多少个数小于平均数。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入若干整数,以;分隔1;2;3;4\n", + "平均数为: 2.5\n", + "大于平均数的有2个,小于平均数的有2个\n" + ] + } + ], + "source": [ + "a=list(eval(input(\"请输入若干整数,以;分隔\").replace(\";\",\",\")))\n", + "b=sum(a)/len(a)\n", + "print(\"平均数为:\",b)\n", + "d=x=0\n", + "for item in a:\n", + " if item>b:\n", + " d=d+1\n", + " elif item分两类1.基于共享文件(Access)2.基于客户机——服务器的DBMS(MySQL等)(一般都是服务端) + +SQL:结构化查询语言:专门用来与数据库通讯的语言(语言/密码) +>1.几乎所有DBNS都支持SQL + +二、SQL软件下载 +Windows平台:https://dev.mysql.com/downloads/mysql/ +或者直接的up主下面链接——百度网盘保存,里面资料里有 +>1.建议安装步骤照着推荐up主第8次课 +2.更改数据可以用写字板打开my.ini,改为重启 +如何关闭——windows+R键打开窗口(用管理员身份)net stop xxx(服务名) + +三、登录 +1、用mysql自带客户端(只限root用户) +2、用windows自带客户端 +> mysql 【-h主机名 -P端口号】 -u root -p密码 + +3.退出——exit/ctrl+c + + +2021年11月22日——27日 + +四、常见命令介绍 + +1、所有命令后面加;(分号) + +2、查看当前所有数据库 +>select databases; + +![] + +3、打开指定库 +>use 库名 + +4、查看当前库所有表 +>show tables; + +5、查看其它库所有表 +>show tables from 库名; + +6、建表 +>create table 表名( +列名 列类型, +列名 列类型, + ··· +); + +7、看表结构 +>desc 表名; + +>总:增加insert,修改update,删除delete,查询select + +8、查看版本 + +登录到服务端 +>select version + +未登录 +>mysql --version +mysql --V + +五、SQL语法规范 + +1、不区分大小写,但建议关键字大写,表名、列名小写 + +2、每条命令;结尾 + +3、每条命令根据需要,可以进行缩进 或换行 + +4、注释 +>单行注释: #注释文字 +单行注释:--注释文字 +多行注释:/*注释文字 */. \ No newline at end of file diff --git "a/docs/views/data \346\224\276/Python\345\244\215\344\271\240\344\276\213\351\242\230.md" "b/docs/views/data \346\224\276/Python\345\244\215\344\271\240\344\276\213\351\242\230.md" new file mode 100644 index 00000000..afce7665 --- /dev/null +++ "b/docs/views/data \346\224\276/Python\345\244\215\344\271\240\344\276\213\351\242\230.md" @@ -0,0 +1,516 @@ +--- + +layout:post +tutle:Python 复习 +date:2021-11-14 +author:胡清月 +categories: +|- 数据分析部 +tags: +|-Python 复习 + +--- +## Python 复习 + +### 1.while循环 + +#### 例1 输出从1加到99的总和 +```python +n=0 +i=1 +while i<=99: + n=n+i + i+=1 +print("总和为:",n) +``` + +#### 例2 输出从1加到用户指定数字的总和 +```python +#法一 (用while循环) +a=int(input("请输入一个整数:"))#注意转化为数字类型 +n=0 +i=1 +while i<=a: + n=n+i + i+=1 +print('1+...+',a,"=",n) +``` + +```python +#法二 (用for in 循环) +a=int(input("请输入一个整数:")) +n=0 +for i in range(a): + n=n+i+1 #range函数为左闭右开区间 所以后面要+1 +print('1+...+',a,"=",n) +``` + +#### 例3 对用户输入的一系列整数求和并计数,当用户输入0,程序结束输入 +```python +#if 和 while的结合 +i=int(input('请输入一个整数:')) +n=0 +while i!=0: + n=n+i + i=int(input('请输入一个整数:')) +print('和为:',n) +``` + +#### 例4 从键盘接收两个整数,编程求出这两个整数的最大公约数和最小公倍数。(求自最大公约数可用辗转相除法:两个整数的最大公约数等于其中较小者与 较大者对较小者余数 的最大公约数,循环下去,直到余数为零结束,此时的较小者即为最大公约数。) +```python +a,b=eval(input("请输入两个整数,以逗号分隔:")) +x,y=a,b +while y!=0: + m=x%y + x=y + y=m +print("zdgys=",x) +print("zdgbs=",a*b/x) +``` + +### 2.if 类题型 + +#### 例1.按照 1$ = 6¥ 人民币的汇率,编写一个美元和人民币的双向兑换程序,并运行 +```python +m=input('请输入需要转化的货币值(美元以$结尾,人民币以¥结尾:') +if m[-1]=="$": + ren=eval(m[0:-1])*6 + print(m+"转化为人民币为:{:.2f}".format(ren)) +elif m[-1]=="¥": + mei=eval(m[0:-1])/6 + print(m+"转化为美元为:{:.2f}".format(mei)) + print(m[0:-1]) # m[0:1]为左闭右开 + print(m) +else: + print('输入无效') +``` +>小tips ——str函数能将数值型变量转换成字符串,这样就可以用+连接字符串 + +*补:<1>关于进制的转化* +*格式化输出65的二进制、八进制、十进制、十六进制的表达形式,及其对应的unicode字符* +```python +print('十进制{0}的二进制为:0B{0:b},八进制为0O{0:o},十六进制为:0X{0:X},对应的unicode字符为{0:c} '.format(65)) +``` +#### 例2 “回文数"是一种数字,如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,这个数字就是回文数。编程实现判定输入的任意一个整数是否是回文数。 +```python +a=str(input('请输入任意整数:')) +if a==a[::-1]: + print('{}是回文数'.format(a)) +else: + print('{}不是回文数'.format(a)) +``` +*补<2>关于翻转* +```python +a="987" +print(a[::-1]) #[::-1]是翻转 +``` +#### 例3 用户设置(即输入)密码,要求密码至少8位,而且只能包含字母汉字、数字、下划线,请编程实现密码输入,并判定其是否合法 +```python +#可以删除_之后再用isalnum()判断 +#isalnum()函数可以判断的字符包括数字、字母、中文字符 +passw=input("请输入密码:") +if len(passw)<8: + print("密码不合法") +else: + if "_" in passw: + passw=passw.replace("_","") + if passw.isalnum(): + print("密码满足要求") + else: + print("密码不满足要求") +``` +### 3. for in 循环 +#### 例1(条件中条件)1、完数指一个数恰好等于它的所有因子之和(不包括其本身)。例:6的因子是1,2,3,而6=1+2+3,因此6是完数,编程输出1000之内的所有完数 +```python +for i in range(3,1001): + n=0 + for v in range(1,i): + if i%v==0: + n=n+v + if n==i: #此处就是与for平级关系 + print(i) +``` +#### 例2 一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱,用100元钱买100只鸡,有几种方案?分别写出。输出格式为: +第1组解:公鸡:0 母鸡:25 小鸡:75 +第2组解:公鸡:4 母鸡:18 小鸡:78 +```python +s=0 +for x in range(0,21): + for y in range(0,34): + if x*5+y*3+(100-x-y)/3==100: + s=s+1 + print("第{}组解:公鸡:{} 母鸡:{} 小鸡:{}".format(s,x,y,100-x-y)) +``` +#### 例3 输出10000之内的所有水仙花数。水仙花数是一个n(n>=3)位数,它的每个位上的数字的n次幂之和等于其本身 +```python +for i in range(1,10001): #着重看 + a=str(i) + b=len(a) + s=0 + for v in range(0,b): + s=s+pow(int(a[v]),b) + if s==i: + print(s) +``` +#### 例4 编写程序,用户输入一个合数,程序将其分解为质因式输出,如:60=2* 2* 3* 5 +```python +n=int(input("请输入一个合数:")) #法一 +s=str(n)+"=" +for i in range(2,n): #i设定为除数 + while n % i==0: #若i除尽n,则i为质因数,重置被除数,连续除i + s=s+str(i)+"*" + n=n//i #布置下一次的被除数 +print(s[0:-1]) +``` +```python +a=int(input("请输入一个合数:")) #法二 +b=2 +c="" +d=a +def sushu(n): + for i in range(2,n): + if n%i==0: + break + else: + return True +while b<=a: #如果用for in循环无法让一个数重复 + if a%b==0 and sushu(b): + c=c+str(b)+"*" + a=a/b + else: + b=b+1 +print('因式分解的结果是:{}={}'.format(d,c[:-1])) +``` +### 4. 函数 +#### 例1 编写实现求一个整数参数的偶数位之和的函数,函数名为evensum。调用该函数,输出整数123456的偶数位的和 +```python +def evensum(n): + v=str(n) + m=v[-2::-2] + a=0 + c="" + for i in range(len(m)): + s=int(m[i]) + a=a+s + return a + +print(evensum(123456)) +``` +>#### tips int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数 +#### 例2 编写函数,实现将二进制字符串转化为10进制数。参数为字符串,返回值为数值。编程实现用户输入二进制数,输出十进制数。 +```python +def f(n): + s=int(n,2) #int函数的第2个参数表示进制。功能则是将字符串转换成十进制整数 + return s +print(f('1000')) +``` +#### 例3 编写匿名函数,实现:传入一个字符串,返回不包含空格在内的字符的个数。调用匿名函数实现对用户输入的字符串进行上述处理,并输出字符串长度。 +```python +process=lambda a:len(a.replace(" ","")) +v=input("请输入字符串:") +print("字符串长度:",process(v)) +``` +*异常处理* +#### 例4 实现isNum()函数,参数为一个字符串,如果这个字符串属于整数、浮点数,则返回True,否则返回False。 +```python +def isNum(n): + try: + if type(eval(n))in [int, float]: + return True + else: + return False + except: + return False +``` +#### 例5 实现isPrime()函数,参数为整数,要有异常处理。如果整数是质数,返回True,否则返回False +```python +def isPrime(n): + try: + a=int(n) + for i in range(2,a): + if a%i==0: #判断素数要把循环全部遍历完再判断 + break + if i==a-1: + return True + else: + return False + except: #不在except段直接return False 可以避免输入有误和输入非质数混淆 + print("不合法元素") + exit(0) #终止程序 + +y=input("请输入一个整数:") +if isPrime(y): + print(y,"是素数") +else: + print(y,"不是素数") +``` +#### 例6 编写一个递归函数,实现将十进制数转化为二进制串,并调用该函数。 +```python +def zhuan(x): #法一 + if x==0: + return "" #当商为0时,无需转换,因此返回空 + else: + z=x%2 #生成余数 + x=x//2 #布置下一次的被除数 + return zhuan(x)+ str(z) #将生成的余数从左边进行连接,符合二进制数生成规律(递归) +s1=zhuan(20) +print(s1) +``` +```python +s="" +def digui(n): + global s #声明s为全局变量,则每次函数调用,都可使用和修改s + x,y=divmod(n,2)#x为商,y为余数 + s=s+str(y) + if x>=1: + return digui(x) #商大于等于1时,继续短除法(递归) + else: + return s[::-1] #将得到的字符串逆序,以符合二进制数生成规律 +a=eval(input("请输入一个十进制数:")) +p=digui(a) +print("它的二进制为:",p) +``` +*补<3>引用函数* +#### 例1 编写程序,利用random库,生成10个随机密码,每个密码固定为10个字符,字符可能是26个小写字母,也可能是10个数字,也可能是!@#¥%^&*8个特殊符号。输出格式为: +hcnk%xtp +5c6fltm@ +*x*8ddz& +4clc0dbn +y651qrdx +....... +```python +import random +v="0123456789!@#¥%^&*abcdefghijklmnopqrstuvwxyz" +for n in range (0,10): + password="" + for i in range(0,10): + a=random.randint(0,43) + password=password+v[a] + print(password) +``` +#### 例2 编程实现:请验证1000以内的偶数是否符合哥德巴赫猜想。哥德巴赫猜想:任何一个大于等于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。 +```python +def sushu(n): + for i in range(2,n): + if n % i == 0: + break + if i == n-1: + return True + else: + return False + +for m in range(6,10,2): + for a in range(3,m//2+1): #这里的m一定是m//2+1 + if sushu(a) and sushu(m-a): #不是很懂 + print("{}={}+{}".format(m,a,m-a),end=" ") + print() +``` +### 5. 列表 +#### 例1 编写程序,接收用户输入的一行由分号“;”分隔的若干个整数,计算这些数的平均数,并且统计有多少个数大于平均数,多少个数小于平均数。 +```python +a=list(eval(input("请输入若干整数,以;分隔").replace(";",","))) +b=sum(a)/len(a) +print("平均数为:",b) +d=x=0 +for item in a: + if item>b: + d=d+1 + elif itemx={1,2,3,4} +x.pop() +#### 例5 编写函数,将一串文本中的辅音字母(去掉元音字母)反序后返回。编写代码,调用该函数。 +```python +def fu(n): + a=input("请输入一串英文文本:") + a=a.replace("a","") + a=a.replace("e","") + a=a.replace("i","") + a=a.replace("o","") + a=a.replace("u","") + a=a.replace("A","") + a=a.replace("E","") + a=a.replace("I","") + a=a.replace("O","") + a=a.replace("U","") + a=a[::-1] + return a +fu(n) +``` +```python +def nixu(s): + h="" + for x in s: + if x in ["a","e","i","o","u","A","E","I","O","U"]: + i=s.index(x) + s=s[0:i]+s[i+1:] + for y in s: + h=y+h + return(h) + +n=input("请输入一段文本:") +print(nixu(n)) +``` +#### 例6 随机生成6行6列的矩阵(每个值都是10~99之间的整数)。求主对角线上元素的乘积,以及副对角线上元素的和。 +```python +a=[] +import random +for j in range(6): + s=[] + for i in range(6): + s.append(random.randint(10,99)) + print(s[i],end=" ") + a.append(s) + print( ) + +v=a[0][0]*a[1][1]*a[2][2]*a[3][3]*a[4][4]*a[5][5] +print(v) +``` +### 6. 集合 +#### 例1 获得用户输入的一个整数N,输出N中所出现不同数字的和。例如:用户输入 123123123,其中所出现的不同数字为:1、2、3,这几个数字和为6。 +```python +N=input("请输入一个整数:") +n=set(N) +v=0 +st="" +for i in n: #对集合中遍历不用range + v=v+int(i) #集合中把字符变成数字 + st=st+"+"+i +print(st[1:],"=",v) +``` +#### 例2 从0到9中随机选择,生成1到10个随机数,这些数字组成集合A。按此方法同样生成集合B。(集合元素个数不定)分别输出A、B集合以及A&B和A|B的结果。 +```python +import random +a=set() +b=set() +for i in range(0,random.randint(1,10)): + a.add(random.randint(0,9)) + b.add(random.randint(0,9)) +print(a) +print(b) +print("a&b:\n",a&b) +print("a|b:\n",a|b) +``` +#### 例3 从0到9中随机选择,生成1到10个随机数,这些数字组成集合A。(集合元素个数不定)。让用户猜集合中的数字,直到全部猜中为止。 +```python +a=set() +import random +for i in range(0,random.randint(1,10)): + a.add(random.randint(0,9)) +print(a) +b=set() +i=0 +while True: #这里为什么用while true + if len(b)