[{"data":1,"prerenderedAt":552},["ShallowReactive",2],{"article-6":3},{"id":4,"title":5,"body":6,"create":541,"description":33,"extension":542,"labels":543,"locked":544,"meta":545,"navigation":546,"path":547,"seo":548,"stem":549,"update":550,"__hash__":551},"articles/article/6.md","Python 基础学习",{"type":7,"value":8,"toc":520},"minimark",[9,13,17,20,23,26,37,40,44,48,59,67,71,145,148,159,162,177,180,183,190,196,199,205,208,214,217,223,226,236,242,245,251,254,257,266,269,279,285,288,298,301,307,310,335,338,345,351,381,384,390,396,403,406,409,415,418,425,431,438,444,447,453,460,463,469,472,478,481,505,508,511,517],[10,11,12],"h2",{"id":12},"起因",[14,15,16],"p",{},"由于十分不喜欢 Python 的代码风格，所以自从本科的 Python 选修课结束之后，就再也没有碰过 Python\n了，现在对它的一些知识也可以说是忘得差不多了。但由于后续学习需要用到 Pyhton，所以这才需要捡起关于 Python 的知识点",[10,18,19],{"id":19},"环境安装",[14,21,22],{},"考虑到以后扩展和管理的方便，就没有单独安装 Python，而是选择安装 Anaconda，而 Anaconda\n的安装也十分的方便，选择好位置，直接下一步就行。但其中注意的是，Anaconda 并不默认添加到 Path，也就是系统的环境变量中，需要在安装过程中勾选\n”添加到 Path“ 中，如果没有勾选，解决办法有两个：一是重新安装；二是手动添加系统环境变量。",[14,24,25],{},"手动添加环境变量，需要添加以下四个新的条目（... 是 anaconda3 安装位置）",[27,28,34],"pre",{"className":29,"code":31,"language":32,"meta":33},[30],"language-txt","...\\anaconda3\n...\\anaconda3\\Scripts\n...\\anaconda3\\Library\\bin\n...\\anaconda3\\Library\\mingw-w64\\bin\n","txt","",[35,36,31],"code",{"__ignoreMap":33},[10,38,39],{"id":39},"数据类型",[41,42,43],"h3",{"id":43},"一般类型",[45,46,47],"h4",{"id":47},"字符串",[14,49,50,51,54,55,58],{},"Python 中的字符串是用双引号 ",[35,52,53],{},"\""," 或者单引号 ",[35,56,57],{},"'"," 包括起来的字符，可以混用，但是得注意范围，",[27,60,65],{"className":61,"code":63,"language":64,"meta":33},[62],"language-python","message = \"I'll get your trail.\" # 这是正确的\nmessage = \"He say:\"Hello\"\" # 错误\n","python",[35,66,63],{"__ignoreMap":33},[68,69,70],"h5",{"id":70},"字符串的方法",[72,73,74,98],"ul",{},[75,76,77,78],"li",{},"去除空格（这里的空格包含了空白字符、制表符、换行符）\n",[72,79,80,86,92],{},[75,81,82,85],{},[35,83,84],{},"lstrip()"," 去除首部空格",[75,87,88,91],{},[35,89,90],{},"rstrip()"," 去除尾部空格",[75,93,94,97],{},[35,95,96],{},"strip()"," 去除首位空格",[75,99,100,101],{},"设置格式\n",[72,102,103,109,115,121,127,133,139],{},[75,104,105,108],{},[35,106,107],{},"title()"," 标题格式",[75,110,111,114],{},[35,112,113],{},"lower()"," 全小写",[75,116,117,120],{},[35,118,119],{},"upper()"," 全大写",[75,122,123,126],{},[35,124,125],{},"center()"," 指定长度，将字符串放中间",[75,128,129,132],{},[35,130,131],{},"ljust()"," 指定长度，将字符串放左边",[75,134,135,138],{},[35,136,137],{},"rjust()"," 指定长度，将字符串放右边",[75,140,141,144],{},[35,142,143],{},"zfill()"," 指定长度，在字符串前面填充 0（处理数字）",[45,146,147],{"id":147},"数字",[14,149,150,151,154,155,158],{},"数字分为整数和浮点数，只要带小数点的就是浮点数，数字类型可以进行加减乘除运算，如果想要类似用 ",[35,152,153],{},"+"," 拼接字符串就需要用到\n",[35,156,157],{},"str()","将数字类型转换为字符串类型。",[45,160,161],{"id":161},"布尔值",[14,163,164,165,168,169,172,173,176],{},"只有两个值 : ",[35,166,167],{},"True"," 和 ",[35,170,171],{},"False"," ，可以使用 ",[35,174,175],{},"bool()"," 方法将其他类型变量转换为布尔值",[41,178,179],{"id":179},"派生类型",[45,181,182],{"id":182},"列表",[14,184,185,186,189],{},"用 ",[35,187,188],{},"[]"," 来创建一个列表，列表中可以是不同类型的变量。",[27,191,194],{"className":192,"code":193,"language":64,"meta":33},[62],"foo = [ 1, 'a', 1.2]\n# 添加\nfoo.append('b')\nfoo.insert(0,'a')\n# 删除\ndel foo[0] # 不会返回删除的值\nfoo.pop() # 会返回删除的值\nfoo.remove() # 不会返回删除的值\n# 修改\nfoo[0] = 100\n# 查看\nprint(foo[1])\n",[35,195,193],{"__ignoreMap":33},[14,197,198],{},"如果想要遍历列表：",[27,200,203],{"className":201,"code":202,"language":64,"meta":33},[62],"for fo in foo:\n    ptrint(fo)\n",[35,204,202],{"__ignoreMap":33},[14,206,207],{},"如果想要删除列表中的指定变量：",[27,209,212],{"className":210,"code":211,"language":64,"meta":33},[62],"while \"a\" in foo:\n    foo.remove(\"a\")\n",[35,213,211],{"__ignoreMap":33},[45,215,216],{"id":216},"元组",[14,218,185,219,222],{},[35,220,221],{},"()"," 表示一个元组，元组内的变量在元组声明之后，元组内的变量便无法改变，但是你可以直接改这个元组。",[45,224,225],{"id":225},"字典",[14,227,185,228,231,232,235],{},[35,229,230],{},"{}"," 表示一个字典，也可以通过 ",[35,233,234],{},"dict()"," 方法来创建一个空字典，字典是以键值对方式来存储的，类似于其他语言的图（Map）。",[27,237,240],{"className":238,"code":239,"language":64,"meta":33},[62],"a_map = {\n    \"key1\": \"value1\",\n    \"key2\": \"value2\",\n}\n# 添加\na_map['key3'] = \"value3\"\n# 删除\ndel a_map['key1']\n# 修改\na_map['key2'] = \"value4\"\n# 访问\nprint(a_map['key3'])\n",[35,241,239],{"__ignoreMap":33},[14,243,244],{},"字典遍历：",[27,246,249],{"className":247,"code":248,"language":64,"meta":33},[62],"# 遍历所有的键\nfor key in a_map.keys():\n    print(key)\n# 遍历所有值\nfor value in a_map.values():\n    print(values)\n# 遍历所有键值对\nfor key, value in a_map.items():\n    print(key + value)\n",[35,250,248],{"__ignoreMap":33},[10,252,253],{"id":253},"流程控制",[41,255,256],{"id":256},"用户输入",[14,258,259,262,263,265],{},[35,260,261],{},"input()"," 接收用户在终端中输入的信息，不管输入的是字符串或是数字 Python 都会视为是字符串。如果需要提示用户输入信息的类型那么在\n",[35,264,261],{}," 中输入提示信息即可。",[41,267,268],{"id":268},"条件语句",[14,270,271,272,168,275,278],{},"Python 中的条件语句就只有 ",[35,273,274],{},"if else",[35,276,277],{},"if elif else"," 。对于输入的条件，可以是布尔值，也可以是逻辑表达式，但是逻辑表达式在某种程度上，逻辑表达式也算是布尔值。",[27,280,283],{"className":281,"code":282,"language":64,"meta":33},[62],"num = 10\nif num \u003C 0:\n    print(\"负数\")\nelif num = 0:\n    print(\"零\")\nelse:\n    print(\"正数\")\n",[35,284,282],{"__ignoreMap":33},[41,286,287],{"id":287},"循环语句",[14,289,290,291,168,294,297],{},"Python 中的循环就只有 ",[35,292,293],{},"while",[35,295,296],{},"for in","。",[14,299,300],{},"指定次数循环：",[27,302,305],{"className":303,"code":304,"language":64,"meta":33},[62],"count = 0\nwhile count \u003C 5:\n    print(count)\n    count += 1\nfor i in range(1, 5):\n    print(i)\n",[35,306,304],{"__ignoreMap":33},[14,308,309],{},"循环控制：",[14,311,312,313,316,317,316,320,323,324,326,327,168,329,331,332,334],{},"在循环中通过 ",[35,314,315],{},"break"," ",[35,318,319],{},"continue",[35,321,322],{},"return"," 关键词就可以对正在进行的循环进行控制；",[35,325,319],{}," 关键词表示跳出这次循环，直接进行下次循环；\n",[35,328,315],{},[35,330,322],{}," 则是直接退出循环，不同的是，",[35,333,322],{}," 会直接返回数据。",[10,336,337],{"id":337},"函数",[14,339,340,341,344],{},"Python 通过 ",[35,342,343],{},"def"," 关键字声明函数：",[27,346,349],{"className":347,"code":348,"language":64,"meta":33},[62],"def function_name(var_name, default_var='default', *vars):\n    return_value = var_name + default_var\n    for var in vars:\n        return_value += var\n    return return_value\n",[35,350,348],{"__ignoreMap":33},[14,352,353,354,357,358,361,362,365,366,368,369,372,373,376,377,380],{},"其中 ",[35,355,356],{},"var_name","、",[35,359,360],{},"default_var"," 是形式参数，",[35,363,364],{},"'default'"," 是为 ",[35,367,360],{}," 赋予的默认实参。",[35,370,371],{},"*vars"," 前的 ",[35,374,375],{},"*","\n表示这是任意数量的参数。如果形参前面是 ",[35,378,379],{},"**"," 则表示这是任意数量的关键字实参，类似于向函数传递一个字典变量。",[10,382,383],{"id":383},"类",[14,385,340,386,389],{},[35,387,388],{},"class"," 关键词来声明类",[27,391,394],{"className":392,"code":393,"language":64,"meta":33},[62],"class MyClass:\n    def __init__(self, name):\n        self.name = name\n  \n    def say_hello(self):\n        print(\"Hello \" + self.name)\n",[35,395,393],{"__ignoreMap":33},[14,397,398,399,402],{},"Python 中没有访问控制机制，也就是说实例化的类中，所有的变量都是可以由外部进行访问的，但是如同常量一样，对于私有成员，Python\n中也有约定俗成的语法，就是在变量前加上下划线，如：",[35,400,401],{},"self._private","。这种属性不推荐在实例外部操作，而是调用实例的内部方法来操作这个属性。",[41,404,405],{"id":405},"继承",[14,407,408],{},"对于类的继承，就非常简单：",[27,410,413],{"className":411,"code":412,"language":64,"meta":33},[62],"class ChildClass(MyClass):\n    def __init__(self, name, age):\n        self.super(self, name)\n        self.age = age\n    # 重写父类方法\n    def say_hello(self):\n        print(self.age, \"Hello \" + self.name)\n",[35,414,412],{"__ignoreMap":33},[10,416,417],{"id":417},"测试",[14,419,420,421,424],{},"Python 中测试的话都需要用到 ",[35,422,423],{},"unittest"," 这个模块，下面我们定义一个方法：",[27,426,429],{"className":427,"code":428,"language":64,"meta":33},[62],"def func_1(name){\n    return str(name).title()\n}\n",[35,430,428],{"__ignoreMap":33},[14,432,433,434,437],{},"如果我们想要测试这个方法，就需要自定义一个类来继承 ",[35,435,436],{},"unittest.TestCase"," 类：",[27,439,442],{"className":440,"code":441,"language":64,"meta":33},[62],"class MyTest(unittest.TestCase):\n    def test_func_1(self):\n        self.assertEqual(\"J00ane\", func_1(\"j00ane\"))\n",[35,443,441],{"__ignoreMap":33},[14,445,446],{},"运行测试：",[27,448,451],{"className":449,"code":450,"language":64,"meta":33},[62],"if __name__ == \"__main__\":\n    unitest.main()\n",[35,452,450],{"__ignoreMap":33},[14,454,455,456,459],{},"如果我们想要对一个类的所有成员方法进行单独的测试，那么每个测试都可能需要新建一个实例，这样做起来很麻烦，所以我们需要用到\n",[35,457,458],{},"SetUp"," 方法",[14,461,462],{},"首先，新建一个类：",[27,464,467],{"className":465,"code":466,"language":64,"meta":33},[62],"class MyClass:\n    def __init__(self, name, age):\n        self.name = name\n        self.age = age\n    def show_name(self):\n        return self.name.title()\n    def show_age(self):\n        return str(self.age)\n",[35,468,466],{"__ignoreMap":33},[14,470,471],{},"在我们的测试类中，可以这样写：",[27,473,476],{"className":474,"code":475,"language":64,"meta":33},[62],"class MyClassTest(unittest.TestCase):\n    def SetUp(self):\n        self.my_class = MyClass(\"j00ane\", 10)\n        self.right_name = \"J00ane\"\n        self.right_age = \"10\"\n    def test_show_name(self):\n        self.assertEqual(self.right_name, self.my_class.show_name())\n    def test_show_age(self):\n        self.assertEqual(self.right_age, self.my_class.show_age())\n",[35,477,475],{"__ignoreMap":33},[14,479,480],{},"运行测试，可以看到所有测试都能通过。",[14,482,483,484,487,488,491,492,316,495,498,499,502,297],{},"除了 ",[35,485,486],{},"assertEqual"," 断言，还有 ",[35,489,490],{},"assertNotEuqal","；判断布尔值：",[35,493,494],{},"assertTrue",[35,496,497],{},"assertFalse","；判断列表： ",[35,500,501],{},"assertIn(item, list)",[35,503,504],{},"assertNotIn(item, list)",[10,506,507],{"id":507},"异常处理",[14,509,510],{},"异常处理非常像分支语句，也就是 if else。它的 语法是这样的：",[27,512,515],{"className":513,"code":514,"language":64,"meta":33},[62],"try:\n    # 语句\nexcept XXXError:\n    # XXXError 的处理语句\nexcept XXError:\n    # XXError 的处理语句\nelse:\n    # 无错误的处理语句\n",[35,516,514],{"__ignoreMap":33},[14,518,519],{},"Python 中要求你写的错误类型非常精确，如果不知道错误类型的话，可以先运行一遍错误的，看看编译器的报错类型，复制过去就行了。",{"title":33,"searchDepth":521,"depth":521,"links":522},2,[523,524,525,530,535,536,539,540],{"id":12,"depth":521,"text":12},{"id":19,"depth":521,"text":19},{"id":39,"depth":521,"text":39,"children":526},[527,529],{"id":43,"depth":528,"text":43},3,{"id":179,"depth":528,"text":179},{"id":253,"depth":521,"text":253,"children":531},[532,533,534],{"id":256,"depth":528,"text":256},{"id":268,"depth":528,"text":268},{"id":287,"depth":528,"text":287},{"id":337,"depth":521,"text":337},{"id":383,"depth":521,"text":383,"children":537},[538],{"id":405,"depth":528,"text":405},{"id":417,"depth":521,"text":417},{"id":507,"depth":521,"text":507},"2023-08-14T02:17:09.000Z","md",[64],false,{},true,"/article/6",{"title":5,"description":33},"article/6","2023-08-31T12:42:19.000Z","cpaZ6OnA6nOoBlheQuQjPYtLJGVT9D1qVo42jEcL2YA",1755235549203]