├── .gitignore ├── example.html ├── example.json ├── gossip0506.csv ├── index.html ├── notebooks ├── Untitled.ipynb ├── Untitled1.ipynb ├── lecture2.ipynb ├── lecture3.ipynb ├── lecture4.ipynb ├── lecture5.ipynb ├── lecture6.ipynb ├── lecture7.ipynb └── lecture8.ipynb ├── readme.md ├── slides.sh └── slides ├── lecture1.pdf ├── lecture2.slides.html ├── lecture3.slides.html ├── lecture4.slides.html ├── lecture5.slides.html ├── lecture6.slides.html ├── lecture7.slides.html └── lecture8.slides.html /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | pip-wheel-metadata/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # IPython 80 | profile_default/ 81 | ipython_config.py 82 | 83 | # pyenv 84 | .python-version 85 | 86 | # celery beat schedule file 87 | celerybeat-schedule 88 | 89 | # SageMath parsed files 90 | *.sage.py 91 | 92 | # Environments 93 | .env 94 | .venv 95 | env/ 96 | venv/ 97 | ENV/ 98 | env.bak/ 99 | venv.bak/ 100 | 101 | # Spyder project settings 102 | .spyderproject 103 | .spyproject 104 | 105 | # Rope project settings 106 | .ropeproject 107 | 108 | # mkdocs documentation 109 | /site 110 | 111 | # mypy 112 | .mypy_cache/ 113 | .dmypy.json 114 | dmypy.json 115 | 116 | # Pyre type checker 117 | .pyre/ 118 | -------------------------------------------------------------------------------- /example.html: -------------------------------------------------------------------------------- 1 |

hello world

2 |

here is some HTML code

3 |
4 |

have a nice day

5 |
-------------------------------------------------------------------------------- /example.json: -------------------------------------------------------------------------------- 1 | { 2 | "firstName": "John", 3 | "lastName": "Smith", 4 | "sex": "male", 5 | "age": 25, 6 | "address": { 7 | "streetAddress": "21 2nd Street", 8 | "city": "New York", 9 | "state": "NY", 10 | "postalCode": "10021" 11 | }, 12 | "phoneNumber": [{ 13 | "type": "home", 14 | "number": "212 555-1234" 15 | }, 16 | { 17 | "type": "fax", 18 | "number": "646 555-4567" 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /gossip0506.csv: -------------------------------------------------------------------------------- 1 | all,down,up 2 | 13,0,7 3 | 249,30,86 4 | 290,41,95 5 | 338,43,107 6 | 280,52,110 7 | 378,39,174 8 | 416,35,183 9 | 360,40,150 10 | 343,53,135 11 | 366,36,157 12 | 341,37,159 13 | 278,26,124 14 | 261,30,120 15 | 198,23,89 16 | 263,30,90 17 | 184,15,83 18 | 168,23,73 19 | 154,26,53 20 | 182,37,64 21 | 120,18,45 22 | 150,21,48 23 | 152,26,50 24 | 142,18,42 25 | 123,23,44 26 | 117,4,61 27 | 101,4,42 28 | 121,10,47 29 | 79,4,25 30 | 73,1,40 31 | 49,7,26 32 | 56,9,20 33 | 60,10,20 34 | 72,8,18 35 | 83,7,27 36 | 86,8,30 37 | 81,12,32 38 | 71,8,28 39 | 72,10,35 40 | 101,12,55 41 | 75,11,40 42 | 94,12,41 43 | 102,14,50 44 | 143,8,74 45 | 161,26,80 46 | 186,22,109 47 | 167,25,83 48 | 191,25,106 49 | 193,29,105 50 | 176,25,110 51 | 308,33,198 52 | 366,52,223 53 | 375,57,211 54 | 421,54,245 55 | 470,49,243 56 | 477,55,249 57 | 462,76,248 58 | 486,62,269 59 | 536,65,280 60 | 587,75,281 61 | 621,84,314 62 | 689,104,318 63 | 630,103,294 64 | 623,94,277 65 | 719,94,327 66 | 664,70,335 67 | 641,98,299 68 | 627,78,287 69 | 719,92,326 70 | 794,101,374 71 | 722,77,336 72 | 827,111,381 73 | 780,98,375 74 | 916,87,471 75 | 1096,152,545 76 | 1109,185,522 77 | 1084,170,498 78 | 1006,175,485 79 | 933,159,431 80 | 937,145,409 81 | 913,147,418 82 | 879,122,419 83 | 841,116,441 84 | 844,118,448 85 | 710,108,361 86 | 629,104,295 87 | 638,70,323 88 | 668,77,348 89 | 620,69,322 90 | 585,59,310 91 | 742,79,378 92 | 687,61,354 93 | 681,88,338 94 | 683,95,318 95 | 774,75,372 96 | 776,76,413 97 | 807,104,404 98 | 727,75,373 99 | 673,87,342 100 | 677,85,385 101 | 713,89,374 102 | 714,97,333 103 | 669,86,357 104 | 690,95,345 105 | 858,127,452 106 | 893,118,449 107 | 753,102,370 108 | 861,130,410 109 | 770,105,368 110 | 798,94,401 111 | 741,98,333 112 | 803,89,400 113 | 799,124,357 114 | 812,139,361 115 | 713,118,343 116 | 705,107,336 117 | 569,101,268 118 | 611,83,321 119 | 657,118,326 120 | 655,142,289 121 | 606,93,288 122 | 584,90,280 123 | 561,90,269 124 | 551,86,287 125 | 547,97,270 126 | 722,109,347 127 | 700,121,308 128 | 539,62,276 129 | 532,73,254 130 | 591,75,281 131 | 679,94,338 132 | 621,97,284 133 | 677,80,316 134 | 555,73,295 135 | 547,85,257 136 | 558,93,274 137 | 593,79,264 138 | 580,84,250 139 | 626,120,260 140 | 621,111,276 141 | 607,111,253 142 | 617,93,266 143 | 656,104,283 144 | 598,126,263 145 | 727,127,277 146 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /notebooks/lecture2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# Variable & Type\n", 12 | "`臺科大 程式設計研究社`\n", 13 | "\n", 14 | "`hanklu`" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "slideshow": { 21 | "slide_type": "slide" 22 | } 23 | }, 24 | "source": [ 25 | "# Variable" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "slideshow": { 32 | "slide_type": "subslide" 33 | } 34 | }, 35 | "source": [ 36 | "- 程式是由「資料」和「指令」所組成\n", 37 | "- `=`\n", 38 | " - assign 賦值、指派\n", 39 | " - 把值放進叫做 x 的箱子\n", 40 | "![](https://i.imgur.com/Q6kGdBQ.png)" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 21, 46 | "metadata": { 47 | "slideshow": { 48 | "slide_type": "subslide" 49 | } 50 | }, 51 | "outputs": [ 52 | { 53 | "name": "stdout", 54 | "output_type": "stream", 55 | "text": [ 56 | "3\n" 57 | ] 58 | } 59 | ], 60 | "source": [ 61 | "x = 1\n", 62 | "y = 2\n", 63 | "print(x+y)" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": { 69 | "slideshow": { 70 | "slide_type": "-" 71 | } 72 | }, 73 | "source": [ 74 | "![](https://i.imgur.com/FstpeaU.png)" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": { 80 | "slideshow": { 81 | "slide_type": "subslide" 82 | } 83 | }, 84 | "source": [ 85 | "## 命名的規則\n", 86 | "\n", 87 | "- 以英文字母開頭\n", 88 | "- 只能用\n", 89 | " - A-z ,大小寫有別\n", 90 | " - 0-9\n", 91 | " - `_` (底線)\n", 92 | "- 保留字不能用\n", 93 | "![](https://i.imgur.com/ITAlZsf.png)" 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": { 99 | "slideshow": { 100 | "slide_type": "subslide" 101 | } 102 | }, 103 | "source": [ 104 | "## 使用好理解的命名,寫程式也要兼顧可讀性\n", 105 | "### Good:\n", 106 | "- num_of_days\n", 107 | "- count\n", 108 | "- message_from_user\n", 109 | "\n", 110 | "### Bad:\n", 111 | "- a1,b1,c1\n", 112 | "- lIll1, magic_number, i_dont_want_any_bug" 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": { 118 | "slideshow": { 119 | "slide_type": "subslide" 120 | } 121 | }, 122 | "source": [ 123 | "## 練習:交換兩個數字" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 16, 129 | "metadata": { 130 | "slideshow": { 131 | "slide_type": "-" 132 | } 133 | }, 134 | "outputs": [ 135 | { 136 | "name": "stdout", 137 | "output_type": "stream", 138 | "text": [ 139 | "5 10\n" 140 | ] 141 | } 142 | ], 143 | "source": [ 144 | "x = 5\n", 145 | "y = 10\n", 146 | "\n", 147 | "# do yourself\n", 148 | "\n", 149 | "print(x, y) # 10, 5" 150 | ] 151 | }, 152 | { 153 | "cell_type": "markdown", 154 | "metadata": { 155 | "slideshow": { 156 | "slide_type": "slide" 157 | } 158 | }, 159 | "source": [ 160 | "# Type 型態" 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": { 166 | "slideshow": { 167 | "slide_type": "subslide" 168 | } 169 | }, 170 | "source": [ 171 | "## note\n", 172 | "\n", 173 | "在教學上我們會很頻繁的用 `print()` 來和電腦互動,這讓初學者很快的了解到底 python 做了什麼。\n", 174 | "\n", 175 | "未來熟悉之後,可以試著在腦袋裡面運作 python,就不需要每個東西都 `print()` 出來驗證。" 176 | ] 177 | }, 178 | { 179 | "cell_type": "markdown", 180 | "metadata": { 181 | "slideshow": { 182 | "slide_type": "subslide" 183 | } 184 | }, 185 | "source": [ 186 | "`type(x)` 回傳 x 物件的的型態\n", 187 | "\n", 188 | "## python 內建型態:\n", 189 | "- `bool` 布林值(True/False)\n", 190 | "- `int` 整數\n", 191 | "- `float` 浮點數(帶有小數的數)\n", 192 | "- `str` 字串\n", 193 | "- `list` 串列\n", 194 | "- `dict` 字典" 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": 32, 200 | "metadata": { 201 | "slideshow": { 202 | "slide_type": "subslide" 203 | } 204 | }, 205 | "outputs": [ 206 | { 207 | "name": "stdout", 208 | "output_type": "stream", 209 | "text": [ 210 | "\n", 211 | "\n", 212 | "\n", 213 | "\n", 214 | "\n", 215 | "\n", 216 | "\n" 217 | ] 218 | } 219 | ], 220 | "source": [ 221 | "print(type(True))\n", 222 | "print(type(1))\n", 223 | "print(type(3.14))\n", 224 | "print(type(\"0987878887\"))\n", 225 | "print(type(\"Happy pig\"))\n", 226 | "print(type(['a','b','c']))\n", 227 | "print(type({\"name\":\"hank\",\"sid\":\"B10530000\"}))" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 33, 233 | "metadata": { 234 | "slideshow": { 235 | "slide_type": "subslide" 236 | } 237 | }, 238 | "outputs": [ 239 | { 240 | "name": "stdout", 241 | "output_type": "stream", 242 | "text": [ 243 | "\n", 244 | "\n", 245 | "\n", 246 | "\n", 247 | "\n", 248 | "\n" 249 | ] 250 | } 251 | ], 252 | "source": [ 253 | "x = True\n", 254 | "print(type(x))\n", 255 | "x = 1\n", 256 | "print(type(x))\n", 257 | "x = 3.14\n", 258 | "print(type(x))\n", 259 | "x = \"pig pig pig\"\n", 260 | "print(type(x))\n", 261 | "x = ['a','b','c']\n", 262 | "print(type(x))\n", 263 | "x = {\"name\":\"hank\",\"sid\":\"B10530000\"}\n", 264 | "print(type(x))" 265 | ] 266 | }, 267 | { 268 | "cell_type": "markdown", 269 | "metadata": { 270 | "slideshow": { 271 | "slide_type": "slide" 272 | } 273 | }, 274 | "source": [ 275 | "# int float\n", 276 | "\n", 277 | "### 四則運算\n", 278 | "\n", 279 | "|符號|解釋|用法|\n", 280 | "|--|--|--|\n", 281 | "|+|加法|2 + 3 = 5|\n", 282 | "|-|減法|2 - 3 = -1|\n", 283 | "|\\*|乘法|2 * 3 = 6|\n", 284 | "|/|浮點數除法|3 / 2 = 1.5|\n", 285 | "|//|整數除法 (商數)|3 // 2 = 1|\n", 286 | "|%|餘數|3 % 2 = 1|\n", 287 | "|\\*\\*|次方|2 \\*\\* 3 = 8|" 288 | ] 289 | }, 290 | { 291 | "cell_type": "code", 292 | "execution_count": 15, 293 | "metadata": {}, 294 | "outputs": [ 295 | { 296 | "name": "stdout", 297 | "output_type": "stream", 298 | "text": [ 299 | "15\n", 300 | "10\n", 301 | "15\n", 302 | "20\n" 303 | ] 304 | } 305 | ], 306 | "source": [ 307 | "x = 10\n", 308 | "print(x+5)\n", 309 | "print(x)\n", 310 | "\n", 311 | "x = x + 5\n", 312 | "print(x)\n", 313 | "\n", 314 | "x += 5\n", 315 | "print(x)" 316 | ] 317 | }, 318 | { 319 | "cell_type": "markdown", 320 | "metadata": { 321 | "slideshow": { 322 | "slide_type": "subslide" 323 | } 324 | }, 325 | "source": [ 326 | "# string\n", 327 | "\n", 328 | "- 以`\"\"` 或 `''`包起來\n", 329 | "- `a+b` 將b加在a之後\n", 330 | "- `a*b` 將a重複b次`(b is int)`" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 101, 336 | "metadata": { 337 | "slideshow": { 338 | "slide_type": "subslide" 339 | } 340 | }, 341 | "outputs": [ 342 | { 343 | "name": "stdout", 344 | "output_type": "stream", 345 | "text": [ 346 | "hello world, \n", 347 | "goodbye everyone\n", 348 | "hello world, hello world, \n", 349 | "hello world, goodbye everyone\n", 350 | "hello world, xxxxx goodbye everyone~~~~~~~~~~~~~~~~~~~~\n" 351 | ] 352 | } 353 | ], 354 | "source": [ 355 | "s1 = 'hello world, '\n", 356 | "s2 = \"goodbye everyone\"\n", 357 | "print(s1)\n", 358 | "print(s2)\n", 359 | "print(s1 * 2)\n", 360 | "print(s1+s2)\n", 361 | "print(s1+' xxxxx '+s2+'~'*20)" 362 | ] 363 | }, 364 | { 365 | "cell_type": "markdown", 366 | "metadata": { 367 | "slideshow": { 368 | "slide_type": "subslide" 369 | } 370 | }, 371 | "source": [ 372 | "## 型態轉換\n", 373 | "\n", 374 | "把某個型態轉換成其他型態\n", 375 | "\n", 376 | "\n", 377 | "### `int()` `float()`\n", 378 | "\n", 379 | "- 從其他形態轉成 int,float\n", 380 | "- 需注意是否為數字:不能將 'abc' 轉換成「數字」\n", 381 | "\n", 382 | "### `str()` \n", 383 | "- 將其他型態轉換為 string" 384 | ] 385 | }, 386 | { 387 | "cell_type": "code", 388 | "execution_count": 22, 389 | "metadata": { 390 | "slideshow": { 391 | "slide_type": "subslide" 392 | } 393 | }, 394 | "outputs": [ 395 | { 396 | "name": "stdout", 397 | "output_type": "stream", 398 | "text": [ 399 | "3.14\n", 400 | "\n", 401 | "3\n", 402 | "\n", 403 | "happy\n" 404 | ] 405 | }, 406 | { 407 | "ename": "ValueError", 408 | "evalue": "invalid literal for int() with base 10: 'happy'", 409 | "output_type": "error", 410 | "traceback": [ 411 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 412 | "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", 413 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"happy\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type error! 不能將 \"happy\" 轉成數字\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 414 | "\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: 'happy'" 415 | ] 416 | } 417 | ], 418 | "source": [ 419 | "# int() 型態轉換\n", 420 | "\n", 421 | "x = 3.14\n", 422 | "print(x)\n", 423 | "print(type(x))\n", 424 | "\n", 425 | "x = int(x)\n", 426 | "print(x)\n", 427 | "print(type(x))\n", 428 | "\n", 429 | "y = \"happy\"\n", 430 | "print(y)\n", 431 | "print(int(y)) # type error! 不能將 \"happy\" 轉成數字" 432 | ] 433 | }, 434 | { 435 | "cell_type": "code", 436 | "execution_count": 23, 437 | "metadata": { 438 | "slideshow": { 439 | "slide_type": "subslide" 440 | } 441 | }, 442 | "outputs": [ 443 | { 444 | "name": "stdout", 445 | "output_type": "stream", 446 | "text": [ 447 | "3\n", 448 | "3.0\n", 449 | "3.14\n", 450 | "3.14\n" 451 | ] 452 | } 453 | ], 454 | "source": [ 455 | "# float()\n", 456 | "\n", 457 | "x = 3\n", 458 | "print(x)\n", 459 | "print(float(x)) # 會是 3.0\n", 460 | "\n", 461 | "x = \"3.14\"\n", 462 | "print(x)\n", 463 | "print(float(x))" 464 | ] 465 | }, 466 | { 467 | "cell_type": "code", 468 | "execution_count": 24, 469 | "metadata": { 470 | "slideshow": { 471 | "slide_type": "subslide" 472 | } 473 | }, 474 | "outputs": [ 475 | { 476 | "name": "stdout", 477 | "output_type": "stream", 478 | "text": [ 479 | "300\n", 480 | "100100100\n" 481 | ] 482 | } 483 | ], 484 | "source": [ 485 | "# str()\n", 486 | "\n", 487 | "x = 100\n", 488 | "print(x * 3)\n", 489 | "\n", 490 | "x = str(x)\n", 491 | "print(x * 3)" 492 | ] 493 | }, 494 | { 495 | "cell_type": "markdown", 496 | "metadata": { 497 | "slideshow": { 498 | "slide_type": "subslide" 499 | } 500 | }, 501 | "source": [ 502 | "# Exercise\n", 503 | "\n", 504 | "小明想和飲料公司進貨蜂蜜檸檬,一杯 35 元,他要買 100 杯,請問他要帶多少錢?" 505 | ] 506 | }, 507 | { 508 | "cell_type": "code", 509 | "execution_count": 78, 510 | "metadata": { 511 | "slideshow": { 512 | "slide_type": "subslide" 513 | } 514 | }, 515 | "outputs": [ 516 | { 517 | "name": "stdout", 518 | "output_type": "stream", 519 | "text": [ 520 | "3500\n", 521 | "3500\n" 522 | ] 523 | } 524 | ], 525 | "source": [ 526 | "print(35 * 100)\n", 527 | "\n", 528 | "# or\n", 529 | "\n", 530 | "price = 35\n", 531 | "number = 100\n", 532 | "print(price * number)" 533 | ] 534 | }, 535 | { 536 | "cell_type": "markdown", 537 | "metadata": { 538 | "slideshow": { 539 | "slide_type": "subslide" 540 | } 541 | }, 542 | "source": [ 543 | "# Exercise\n", 544 | "\n", 545 | "小明還沒決定買幾杯,你可以幫他寫一隻程式,讓他隨時可以輸入一杯的單價和買的量,print()出他需要帶多少錢嗎??" 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": 79, 551 | "metadata": { 552 | "slideshow": { 553 | "slide_type": "-" 554 | } 555 | }, 556 | "outputs": [ 557 | { 558 | "name": "stdout", 559 | "output_type": "stream", 560 | "text": [ 561 | "15\n" 562 | ] 563 | } 564 | ], 565 | "source": [ 566 | "price = int(input())\n", 567 | "# do your self...\n" 568 | ] 569 | }, 570 | { 571 | "cell_type": "markdown", 572 | "metadata": { 573 | "slideshow": { 574 | "slide_type": "slide" 575 | } 576 | }, 577 | "source": [ 578 | "## 初探 function & method\n", 579 | "\n", 580 | "- method 是一種 function,兩者作用的地方不太一樣\n", 581 | "- 會用 call 這個動詞來說明使用一個 function 或 method(call `print()` function)\n", 582 | "- 每個 function 都有名字\n", 583 | "- 可以傳入「參數(parameter)」\n", 584 | "- 會 return 值或 None\n", 585 | "\n", 586 | "" 587 | ] 588 | }, 589 | { 590 | "cell_type": "markdown", 591 | "metadata": { 592 | "slideshow": { 593 | "slide_type": "subslide" 594 | } 595 | }, 596 | "source": [ 597 | "## Function\n", 598 | "\n", 599 | "" 600 | ] 601 | }, 602 | { 603 | "cell_type": "code", 604 | "execution_count": 7, 605 | "metadata": { 606 | "slideshow": { 607 | "slide_type": "-" 608 | } 609 | }, 610 | "outputs": [ 611 | { 612 | "name": "stdout", 613 | "output_type": "stream", 614 | "text": [ 615 | "3.14\n", 616 | "-3.14\n", 617 | "3.14\n" 618 | ] 619 | } 620 | ], 621 | "source": [ 622 | "x = -3.14\n", 623 | "print(abs(x))\n", 624 | "print(x)\n", 625 | "\n", 626 | "x = abs(x)\n", 627 | "print(x)" 628 | ] 629 | }, 630 | { 631 | "cell_type": "markdown", 632 | "metadata": { 633 | "slideshow": { 634 | "slide_type": "subslide" 635 | } 636 | }, 637 | "source": [ 638 | "### `print()` 是我們已經用的很習慣的 function\n", 639 | "- return None (回傳一個 None)\n", 640 | "- 他可以有不同的「參數」\n", 641 | "![](https://i.imgur.com/wAc08qX.png)" 642 | ] 643 | }, 644 | { 645 | "cell_type": "code", 646 | "execution_count": 9, 647 | "metadata": { 648 | "slideshow": { 649 | "slide_type": "subslide" 650 | } 651 | }, 652 | "outputs": [ 653 | { 654 | "name": "stdout", 655 | "output_type": "stream", 656 | "text": [ 657 | "hello world\n", 658 | "hello world today is a good day\n", 659 | "hello world~~~~~~today is a good day~~~~~~hello world!!!\n", 660 | "\n", 661 | "\n" 662 | ] 663 | } 664 | ], 665 | "source": [ 666 | "x = \"hello world\"\n", 667 | "print(x)\n", 668 | "print(x,'today is a good day')\n", 669 | "print(x,'today is a good day',x,sep=\"~~~~~~\",end=\"!!!\\n\\n\\n\")" 670 | ] 671 | }, 672 | { 673 | "cell_type": "markdown", 674 | "metadata": { 675 | "slideshow": { 676 | "slide_type": "subslide" 677 | } 678 | }, 679 | "source": [ 680 | "## method 是什麼呢?\n", 681 | "\n", 682 | "- 不同「型態」上的 function,如 `string` 的 method\n", 683 | "- 用 `.` 接在一個 `variable`、`object` 之後" 684 | ] 685 | }, 686 | { 687 | "cell_type": "code", 688 | "execution_count": 11, 689 | "metadata": { 690 | "slideshow": { 691 | "slide_type": "subslide" 692 | } 693 | }, 694 | "outputs": [ 695 | { 696 | "name": "stdout", 697 | "output_type": "stream", 698 | "text": [ 699 | "11\n", 700 | "hey! world\n", 701 | "big mouce\n" 702 | ] 703 | } 704 | ], 705 | "source": [ 706 | "x = \"hello world\"\n", 707 | "# 對 len() 這個 function 傳入 x 這個 string\n", 708 | "print(len(x))\n", 709 | "\n", 710 | "# replace() 是一種 string 的「方法」\n", 711 | "# 對 x 這個 string 做一個 replace() 的動作,傳入 \"hello\",\"hey!\" 兩個參數,回傳一個新的 string\n", 712 | "print(x.replace(\"hello\",\"hey!\"))\n", 713 | "print('mickey mouce'.replace(\"mickey\",\"big\"))" 714 | ] 715 | }, 716 | { 717 | "cell_type": "markdown", 718 | "metadata": { 719 | "slideshow": { 720 | "slide_type": "slide" 721 | } 722 | }, 723 | "source": [ 724 | "## string常用的\n", 725 | "\n", 726 | "[see document](https://docs.python.org/3.6/library/stdtypes.html#string-methods)\n", 727 | "\n", 728 | "## function\n", 729 | "\n", 730 | "`len(x)` 回傳x字串的長度\n", 731 | "\n", 732 | "## method\n", 733 | "\n", 734 | "以`.` 接在 string variable 之後\n", 735 | "\n", 736 | "### `s.replace(a,b)`\n", 737 | "\n", 738 | "- 將 a 的內容以 b 取代" 739 | ] 740 | }, 741 | { 742 | "cell_type": "code", 743 | "execution_count": 42, 744 | "metadata": { 745 | "slideshow": { 746 | "slide_type": "subslide" 747 | } 748 | }, 749 | "outputs": [ 750 | { 751 | "name": "stdout", 752 | "output_type": "stream", 753 | "text": [ 754 | "I like to eat apple\n", 755 | "Iliketoeatapple\n", 756 | "I like to eat banana\n", 757 | "I don't like to eat banana\n" 758 | ] 759 | } 760 | ], 761 | "source": [ 762 | "s = \"I like to eat apple\"\n", 763 | "\n", 764 | "print(s)\n", 765 | "print(s.replace(\" \",\"\")) # replace space with nothing! -> 去除空白\n", 766 | "print(s.replace(\"apple\",\"banana\")) # replace apple with banana\n", 767 | "\n", 768 | "s = s.replace(\"apple\",\"banana\").replace(\"like\",\"don't like\") #先替換 apple 再替換 like\n", 769 | "print(s)" 770 | ] 771 | }, 772 | { 773 | "cell_type": "markdown", 774 | "metadata": { 775 | "slideshow": { 776 | "slide_type": "subslide" 777 | } 778 | }, 779 | "source": [ 780 | "## string method\n", 781 | "\n", 782 | "### `s.strip(a)`\n", 783 | "- 預設 a 為 `\" \"` (空白)\n", 784 | "- 把 a 從頭尾去除\n", 785 | "\n", 786 | "### `s.lstript(a)` \n", 787 | "- 把 a 從左邊去除\n", 788 | "\n", 789 | "### `s.rstript(a)`\n", 790 | "- 把 a 從右邊去除\n" 791 | ] 792 | }, 793 | { 794 | "cell_type": "code", 795 | "execution_count": 35, 796 | "metadata": { 797 | "slideshow": { 798 | "slide_type": "subslide" 799 | } 800 | }, 801 | "outputs": [ 802 | { 803 | "name": "stdout", 804 | "output_type": "stream", 805 | "text": [ 806 | " hey whats up \n", 807 | "hey whats up\n", 808 | " hey whats up ++++\n", 809 | " hey whats up ++++\n", 810 | "++++ hey whats up \n" 811 | ] 812 | } 813 | ], 814 | "source": [ 815 | "s = \" hey whats up \"\n", 816 | "print(s)\n", 817 | "print(s.strip())\n", 818 | "\n", 819 | "s = \"++++ hey whats up ++++\"\n", 820 | "print(s.lstrip(\"+\"))\n", 821 | "print(s.lstrip(\"+\"))\n", 822 | "print(s.rstrip(\"+\"))" 823 | ] 824 | }, 825 | { 826 | "cell_type": "markdown", 827 | "metadata": { 828 | "slideshow": { 829 | "slide_type": "subslide" 830 | } 831 | }, 832 | "source": [ 833 | "## string method\n", 834 | "\n", 835 | "### `s.split(a)`\n", 836 | "- 以 `a` 切開\n", 837 | "- 預設為空白\n", 838 | "\n", 839 | "### `s.count(a)`\n", 840 | "\n", 841 | "- 字串中有多少個 `a`\n", 842 | "\n", 843 | "### `s.startswith(a)` `s.endswith(a)`\n", 844 | "\n", 845 | "- 字串中是不是以 `a` 為開頭?\n", 846 | "- 回傳 True/False" 847 | ] 848 | }, 849 | { 850 | "cell_type": "code", 851 | "execution_count": 52, 852 | "metadata": { 853 | "slideshow": { 854 | "slide_type": "subslide" 855 | } 856 | }, 857 | "outputs": [ 858 | { 859 | "name": "stdout", 860 | "output_type": "stream", 861 | "text": [ 862 | "['it', 'is', 'the', 'real', 'life?/it', 'is', 'just', 'fantasy?']\n", 863 | "['it is the real life?', 'it is just fantasy?']\n", 864 | "2\n", 865 | "True\n", 866 | "False\n" 867 | ] 868 | } 869 | ], 870 | "source": [ 871 | "s = \"it is the real life?/it is just fantasy?\"\n", 872 | "print(s.split())\n", 873 | "print(s.split('/'))\n", 874 | "print(s.count('is'))\n", 875 | "print(s.startswith('it'))\n", 876 | "print(s.endswith('pineapple'))" 877 | ] 878 | }, 879 | { 880 | "cell_type": "markdown", 881 | "metadata": { 882 | "slideshow": { 883 | "slide_type": "subslide" 884 | } 885 | }, 886 | "source": [ 887 | "# 練習:fix bug" 888 | ] 889 | }, 890 | { 891 | "cell_type": "code", 892 | "execution_count": 95, 893 | "metadata": {}, 894 | "outputs": [ 895 | { 896 | "ename": "SyntaxError", 897 | "evalue": "invalid syntax (, line 4)", 898 | "output_type": "error", 899 | "traceback": [ 900 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m s = \"I want to break free'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" 901 | ] 902 | } 903 | ], 904 | "source": [ 905 | "s = 'this is a book'\n", 906 | "print(s\n", 907 | " \n", 908 | "s = \"I want to break free'\n", 909 | "print(s)\n", 910 | "\n", 911 | "'under presure' = s\n", 912 | "print(s[20])\n" 913 | ] 914 | }, 915 | { 916 | "cell_type": "markdown", 917 | "metadata": { 918 | "slideshow": { 919 | "slide_type": "subslide" 920 | } 921 | }, 922 | "source": [ 923 | "## string method\n", 924 | "\n", 925 | "### `s.format()`\n", 926 | "- `{}` 標記位置\n", 927 | "- 將傳入的值替換到指定的位子" 928 | ] 929 | }, 930 | { 931 | "cell_type": "code", 932 | "execution_count": 86, 933 | "metadata": { 934 | "slideshow": { 935 | "slide_type": "subslide" 936 | } 937 | }, 938 | "outputs": [ 939 | { 940 | "name": "stdout", 941 | "output_type": "stream", 942 | "text": [ 943 | "hank loves python\n", 944 | "jason loves java\n", 945 | "today is 2019/2/26\n", 946 | "apple,apple,mango,apple\n" 947 | ] 948 | } 949 | ], 950 | "source": [ 951 | "s = \"{} loves {}\".format(\"hank\",\"python\")\n", 952 | "print(s)\n", 953 | "\n", 954 | "s = \"{} loves {}\".format(\"jason\",\"java\")\n", 955 | "print(s)\n", 956 | "\n", 957 | "s = \"today is {year}/{month}/{day}\".format(year=2019,month=2,day=26)\n", 958 | "print(s)\n", 959 | "\n", 960 | "s = \"{0},{0},{1},{0}\".format(\"apple\",\"mango\")\n", 961 | "print(s)" 962 | ] 963 | }, 964 | { 965 | "cell_type": "markdown", 966 | "metadata": { 967 | "slideshow": { 968 | "slide_type": "slide" 969 | } 970 | }, 971 | "source": [ 972 | "## List\n", 973 | "\n", 974 | "- 一連串的東西\n", 975 | "- 以 `[]` 框住,逗號分隔" 976 | ] 977 | }, 978 | { 979 | "cell_type": "markdown", 980 | "metadata": { 981 | "slideshow": { 982 | "slide_type": "subslide" 983 | } 984 | }, 985 | "source": [ 986 | "## 常用的\n", 987 | "\n", 988 | "## function\n", 989 | "\n", 990 | "### `len(x)`\n", 991 | "- 回傳 x 的長度\n", 992 | "### `sum(x)`\n", 993 | "- 回傳 x 中所有 element 的和\n", 994 | "### `max(x)` `min(x)`\n", 995 | "- 回傳最大值或最小值\n", 996 | "### `sorted(x),`\n", 997 | "- 排序 x" 998 | ] 999 | }, 1000 | { 1001 | "cell_type": "code", 1002 | "execution_count": 56, 1003 | "metadata": { 1004 | "slideshow": { 1005 | "slide_type": "subslide" 1006 | } 1007 | }, 1008 | "outputs": [ 1009 | { 1010 | "name": "stdout", 1011 | "output_type": "stream", 1012 | "text": [ 1013 | "['a', 'b', 'c', 'd', 'e', 'f']\n", 1014 | "6\n", 1015 | "357\n", 1016 | "88\n", 1017 | "6\n", 1018 | "[6, 6, 8, 40, 55, 66, 88, 88]\n" 1019 | ] 1020 | } 1021 | ], 1022 | "source": [ 1023 | "alphabets = ['a','b','c','d','e','f']\n", 1024 | "print(alphabets)\n", 1025 | "print(len(alphabets))\n", 1026 | "\n", 1027 | "numbers = [55,6,88,40,6,66,8,88]\n", 1028 | "print(sum(numbers))\n", 1029 | "print(max(numbers))\n", 1030 | "print(min(numbers))\n", 1031 | "print(sorted(numbers))" 1032 | ] 1033 | }, 1034 | { 1035 | "cell_type": "markdown", 1036 | "metadata": { 1037 | "slideshow": { 1038 | "slide_type": "subslide" 1039 | } 1040 | }, 1041 | "source": [ 1042 | "## method\n", 1043 | "\n", 1044 | "### `lst.append(a)` \n", 1045 | "- 將 a 加到 lst 的後面\n", 1046 | "\n", 1047 | "### `lst.pop()` \n", 1048 | "- 將最後一個刪除掉\n" 1049 | ] 1050 | }, 1051 | { 1052 | "cell_type": "code", 1053 | "execution_count": 55, 1054 | "metadata": { 1055 | "slideshow": { 1056 | "slide_type": "subslide" 1057 | } 1058 | }, 1059 | "outputs": [ 1060 | { 1061 | "name": "stdout", 1062 | "output_type": "stream", 1063 | "text": [ 1064 | "['a', 'b', 'c', 'd']\n", 1065 | "['a', 'b', 'c', 'd', 'e', 'f']\n", 1066 | "['a', 'b', 'c', 'd', 'e']\n" 1067 | ] 1068 | } 1069 | ], 1070 | "source": [ 1071 | "lst = ['a','b','c','d']\n", 1072 | "\n", 1073 | "print(lst)\n", 1074 | "\n", 1075 | "lst.append('e') # 把 'e' 加到後面\n", 1076 | "lst.append('f')\n", 1077 | "print(lst)\n", 1078 | "\n", 1079 | "lst.pop()\n", 1080 | "print(lst)" 1081 | ] 1082 | }, 1083 | { 1084 | "cell_type": "markdown", 1085 | "metadata": { 1086 | "slideshow": { 1087 | "slide_type": "subslide" 1088 | } 1089 | }, 1090 | "source": [ 1091 | "# 練習 fix bug" 1092 | ] 1093 | }, 1094 | { 1095 | "cell_type": "code", 1096 | "execution_count": 97, 1097 | "metadata": {}, 1098 | "outputs": [ 1099 | { 1100 | "ename": "NameError", 1101 | "evalue": "name 'a' is not defined", 1102 | "output_type": "error", 1103 | "traceback": [ 1104 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 1105 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 1106 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mlst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'b'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlst\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mlst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlst\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 1107 | "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" 1108 | ] 1109 | } 1110 | ], 1111 | "source": [ 1112 | "lst = [a,'b','c']\n", 1113 | "print(lst)\n", 1114 | "\n", 1115 | "lst = {1,2,3,4}\n", 1116 | "print(lst)\n", 1117 | "\n", 1118 | "lst = [1,2,3,4]\n", 1119 | "print(lst[5])" 1120 | ] 1121 | }, 1122 | { 1123 | "cell_type": "markdown", 1124 | "metadata": { 1125 | "slideshow": { 1126 | "slide_type": "slide" 1127 | } 1128 | }, 1129 | "source": [ 1130 | "## Slice 切片\n", 1131 | "\n", 1132 | "- 對 `string`, `list` 取值的方法\n", 1133 | "- `[position]` 第 position 位置的值\n", 1134 | "- `[start: end : step]` 開始、結束、間隔\n", 1135 | "\n", 1136 | "\n", 1137 | "|用法|效果|\n", 1138 | "|-|-|\n", 1139 | "| `[a]` | 提取第 a 項的值|\n", 1140 | "| `[:]` | 提取全部|\n", 1141 | "| `[:b]` | 從第0個 ~ 第 b-1 個|\n", 1142 | "| `[a:]` | 從第a個 ~ 最後|\n", 1143 | "| `[a:b]` | 從第a個 ~ 第 b 個|\n", 1144 | "| `[a:b:c]` | 從第a項開始到第b-1項,每次間隔c|" 1145 | ] 1146 | }, 1147 | { 1148 | "cell_type": "code", 1149 | "execution_count": 57, 1150 | "metadata": { 1151 | "slideshow": { 1152 | "slide_type": "subslide" 1153 | } 1154 | }, 1155 | "outputs": [ 1156 | { 1157 | "name": "stdout", 1158 | "output_type": "stream", 1159 | "text": [ 1160 | "7\n", 1161 | "a\n", 1162 | "b\n", 1163 | "\n" 1164 | ] 1165 | } 1166 | ], 1167 | "source": [ 1168 | "s = ['a','b','c','d','e','f','g']\n", 1169 | "\n", 1170 | "print(len(s))\n", 1171 | "print(s[0])\n", 1172 | "print(s[1])\n", 1173 | "print(type(s[1]))" 1174 | ] 1175 | }, 1176 | { 1177 | "cell_type": "code", 1178 | "execution_count": 58, 1179 | "metadata": { 1180 | "slideshow": { 1181 | "slide_type": "subslide" 1182 | } 1183 | }, 1184 | "outputs": [ 1185 | { 1186 | "name": "stdout", 1187 | "output_type": "stream", 1188 | "text": [ 1189 | "ABCDE\n", 1190 | "FGHIJK\n", 1191 | "DEFGH\n", 1192 | "ACEGIK\n" 1193 | ] 1194 | } 1195 | ], 1196 | "source": [ 1197 | "s = \"ABCDEFGHIJK\"\n", 1198 | "\n", 1199 | "print(s[:5])\n", 1200 | "print(s[5:])\n", 1201 | "print(s[3:8])\n", 1202 | "print(s[::2])" 1203 | ] 1204 | }, 1205 | { 1206 | "cell_type": "markdown", 1207 | "metadata": { 1208 | "slideshow": { 1209 | "slide_type": "subslide" 1210 | } 1211 | }, 1212 | "source": [ 1213 | "# 練習:你幾梯的\n", 1214 | "\n", 1215 | "### 輸入學號 ,判斷他是哪一個學年度入學的?\n", 1216 | "\n", 1217 | "### input\n", 1218 | "B10530001\n", 1219 | "B10300888\n", 1220 | "B10700888\n", 1221 | "M10200111\n", 1222 | "\n", 1223 | "### output\n", 1224 | "105\n", 1225 | "103\n", 1226 | "107\n", 1227 | "102\n" 1228 | ] 1229 | }, 1230 | { 1231 | "cell_type": "code", 1232 | "execution_count": 87, 1233 | "metadata": { 1234 | "slideshow": { 1235 | "slide_type": "-" 1236 | } 1237 | }, 1238 | "outputs": [ 1239 | { 1240 | "name": "stdout", 1241 | "output_type": "stream", 1242 | "text": [ 1243 | "1\n" 1244 | ] 1245 | } 1246 | ], 1247 | "source": [ 1248 | "sid = input()\n", 1249 | "# do yourself" 1250 | ] 1251 | }, 1252 | { 1253 | "cell_type": "markdown", 1254 | "metadata": { 1255 | "slideshow": { 1256 | "slide_type": "subslide" 1257 | } 1258 | }, 1259 | "source": [ 1260 | "# 練習:你讀哪啦\n", 1261 | "\n", 1262 | "### 輸入某學校的 mail ,判斷他是哪個學校!\n", 1263 | "\n", 1264 | "- `B10530004@mail.ntust.edu.tw` -> ntust\n", 1265 | "- `b05000000@mail.ntu.edu.tw` -> ntu\n", 1266 | "- `b05000000@ntnu.edu.tw` -> ntnu\n", 1267 | "- `b05000000@fju.edu.tw` -> fju" 1268 | ] 1269 | }, 1270 | { 1271 | "cell_type": "code", 1272 | "execution_count": 88, 1273 | "metadata": {}, 1274 | "outputs": [ 1275 | { 1276 | "name": "stdout", 1277 | "output_type": "stream", 1278 | "text": [ 1279 | "1\n" 1280 | ] 1281 | } 1282 | ], 1283 | "source": [ 1284 | "mail = input()\n", 1285 | "# do yourself" 1286 | ] 1287 | }, 1288 | { 1289 | "cell_type": "markdown", 1290 | "metadata": { 1291 | "slideshow": { 1292 | "slide_type": "slide" 1293 | } 1294 | }, 1295 | "source": [ 1296 | "## dict 字典\n", 1297 | "- `key` `value` pair\n", 1298 | "- `key` 為 `str`\n", 1299 | "- `value` 為任意的 object" 1300 | ] 1301 | }, 1302 | { 1303 | "cell_type": "code", 1304 | "execution_count": 65, 1305 | "metadata": { 1306 | "slideshow": { 1307 | "slide_type": "subslide" 1308 | } 1309 | }, 1310 | "outputs": [ 1311 | { 1312 | "name": "stdout", 1313 | "output_type": "stream", 1314 | "text": [ 1315 | "{'name': 'hank', 'sid': 'B10530000', 'age': 18, 'is_friendly': True}\n", 1316 | "{'name': 'hank', 'sid': 'B10530000', 'age': 19, 'is_friendly': True}\n", 1317 | "{'name': 'hank', 'sid': 'B10530000', 'age': 19, 'is_friendly': True, 'gender': 'male'}\n", 1318 | "{'name': 'hank', 'sid': 'B10530000', 'age': 19, 'is_friendly': True, 'gender': 'male', 'phone': 'iPhone 6s'}\n" 1319 | ] 1320 | } 1321 | ], 1322 | "source": [ 1323 | "dic = {\n", 1324 | " 'name':'hank',\n", 1325 | " 'sid':'B10530000',\n", 1326 | " 'age':18,\n", 1327 | " 'is_friendly': True\n", 1328 | "}\n", 1329 | "\n", 1330 | "print(dic)\n", 1331 | "\n", 1332 | "dic['age'] = 19\n", 1333 | "print(dic)\n", 1334 | "\n", 1335 | "dic['gender'] = 'male'\n", 1336 | "print(dic)\n", 1337 | "\n", 1338 | "dic['phone'] = 'iPhone 6s'\n", 1339 | "print(dic)\n" 1340 | ] 1341 | }, 1342 | { 1343 | "cell_type": "markdown", 1344 | "metadata": { 1345 | "slideshow": { 1346 | "slide_type": "subslide" 1347 | } 1348 | }, 1349 | "source": [ 1350 | "## dict method\n", 1351 | "\n", 1352 | "### `dic[x]` \n", 1353 | "- 取出 key 為 x 的那一項,,若不存在會出現 error\n", 1354 | "\n", 1355 | "### `dic.get(x)` \n", 1356 | "- 取出 key 為 x 的那一項,若不存在會回傳 None" 1357 | ] 1358 | }, 1359 | { 1360 | "cell_type": "code", 1361 | "execution_count": 76, 1362 | "metadata": { 1363 | "slideshow": { 1364 | "slide_type": "subslide" 1365 | } 1366 | }, 1367 | "outputs": [ 1368 | { 1369 | "name": "stdout", 1370 | "output_type": "stream", 1371 | "text": [ 1372 | "hank\n", 1373 | "18\n", 1374 | "None\n" 1375 | ] 1376 | }, 1377 | { 1378 | "ename": "KeyError", 1379 | "evalue": "'address'", 1380 | "output_type": "error", 1381 | "traceback": [ 1382 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 1383 | "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", 1384 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdic\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'address'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdic\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'address'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# key error!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 1385 | "\u001b[0;31mKeyError\u001b[0m: 'address'" 1386 | ] 1387 | } 1388 | ], 1389 | "source": [ 1390 | "dic = {\n", 1391 | " 'name':'hank',\n", 1392 | " 'sid':'B10530000',\n", 1393 | " 'age':18,\n", 1394 | " 'is_friendly': True\n", 1395 | "}\n", 1396 | "\n", 1397 | "print(dic['name'])\n", 1398 | "print(dic.get('age'))\n", 1399 | "\n", 1400 | "print(dic.get('address'))\n", 1401 | "print(dic['address']) # key error!" 1402 | ] 1403 | }, 1404 | { 1405 | "cell_type": "markdown", 1406 | "metadata": { 1407 | "slideshow": { 1408 | "slide_type": "subslide" 1409 | } 1410 | }, 1411 | "source": [ 1412 | "# 練習:fix bug 肥胖問題\n", 1413 | "\n", 1414 | "### 幫 Hank 算一下 BMI 吧" 1415 | ] 1416 | }, 1417 | { 1418 | "cell_type": "code", 1419 | "execution_count": 91, 1420 | "metadata": {}, 1421 | "outputs": [ 1422 | { 1423 | "ename": "SyntaxError", 1424 | "evalue": "invalid syntax (, line 5)", 1425 | "output_type": "error", 1426 | "traceback": [ 1427 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m gender: 'male'\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" 1428 | ] 1429 | } 1430 | ], 1431 | "source": [ 1432 | "body = {\n", 1433 | " 'height': 180,\n", 1434 | " 'weight': 70,\n", 1435 | " 'age': 37\n", 1436 | " gender: 'male'\n", 1437 | "}\n", 1438 | "\n", 1439 | "# do yourself" 1440 | ] 1441 | } 1442 | ], 1443 | "metadata": { 1444 | "celltoolbar": "Slideshow", 1445 | "kernelspec": { 1446 | "display_name": "Python 3", 1447 | "language": "python", 1448 | "name": "python3" 1449 | }, 1450 | "language_info": { 1451 | "codemirror_mode": { 1452 | "name": "ipython", 1453 | "version": 3 1454 | }, 1455 | "file_extension": ".py", 1456 | "mimetype": "text/x-python", 1457 | "name": "python", 1458 | "nbconvert_exporter": "python", 1459 | "pygments_lexer": "ipython3", 1460 | "version": "3.6.5" 1461 | } 1462 | }, 1463 | "nbformat": 4, 1464 | "nbformat_minor": 2 1465 | } 1466 | -------------------------------------------------------------------------------- /notebooks/lecture3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# Condition\n", 12 | "\n", 13 | "`臺科大 程式設計研究社`\n", 14 | "\n", 15 | "`hanklu`" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "slideshow": { 22 | "slide_type": "slide" 23 | } 24 | }, 25 | "source": [ 26 | "## 條件判斷的運算子\n", 27 | "- 回傳 True/False\n", 28 | "\n", 29 | "|運算子|作用|\n", 30 | "|--|--|\n", 31 | "|`a == b`| a 和 b 相等|\n", 32 | "|`a != b`| a 和 b 不相等|\n", 33 | "|`a > b`| |\n", 34 | "|`a < b`| |\n", 35 | "|`a >= b`| |\n", 36 | "|`a <= b`| |\n" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 4, 42 | "metadata": { 43 | "slideshow": { 44 | "slide_type": "subslide" 45 | } 46 | }, 47 | "outputs": [ 48 | { 49 | "name": "stdout", 50 | "output_type": "stream", 51 | "text": [ 52 | "True\n", 53 | "True\n", 54 | "True\n", 55 | "True\n", 56 | "True\n", 57 | "False\n" 58 | ] 59 | } 60 | ], 61 | "source": [ 62 | "print(1==1)\n", 63 | "print(2!=1)\n", 64 | "print(2>1)\n", 65 | "print(2>=1)\n", 66 | "\n", 67 | "print(1<2)\n", 68 | "print(1==2)" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": { 74 | "slideshow": { 75 | "slide_type": "subslide" 76 | } 77 | }, 78 | "source": [ 79 | "## 每一種 type 都可以對應到 True/False\n", 80 | "\n", 81 | "### False\n", 82 | "\n", 83 | "- zero of any numeric type\n", 84 | "- any empty sequence\n", 85 | "- any empty mapping\n", 86 | "\n", 87 | "|範例|說明|\n", 88 | "|--|--|\n", 89 | "|0|零|\n", 90 | "|0.0||\n", 91 | "|''|空的 string|\n", 92 | "|[]|空的 list|\n", 93 | "|{}|空的 dict |\n", 94 | "\n", 95 | "### 其他都是 True" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 8, 101 | "metadata": { 102 | "slideshow": { 103 | "slide_type": "subslide" 104 | } 105 | }, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "False\n", 112 | "True\n", 113 | "False\n", 114 | "True\n", 115 | "False\n", 116 | "True\n", 117 | "False\n", 118 | "True\n" 119 | ] 120 | } 121 | ], 122 | "source": [ 123 | "print(bool(0))\n", 124 | "print(bool(1))\n", 125 | "\n", 126 | "print(bool(''))\n", 127 | "print(bool('Haha'))\n", 128 | "\n", 129 | "print(bool([]))\n", 130 | "print(bool(['haha','heyhey']))\n", 131 | "\n", 132 | "print(bool({}))\n", 133 | "print(bool({'name':'hank'}))" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": { 139 | "slideshow": { 140 | "slide_type": "slide" 141 | } 142 | }, 143 | "source": [ 144 | "## `If` `elif` `else`\n", 145 | "\n", 146 | "- 在此之前我們看到的程式都是逐行執行(sequential execution)\n", 147 | "- 現在我們多了比較複雜的控制結構\n", 148 | "\n", 149 | "![](http://3.bp.blogspot.com/-uu_nZTD71s0/TznCog-aTzI/AAAAAAAAkdY/x5_fxowoL2U/s640/cover.jpg)" 150 | ] 151 | }, 152 | { 153 | "cell_type": "markdown", 154 | "metadata": { 155 | "slideshow": { 156 | "slide_type": "subslide" 157 | } 158 | }, 159 | "source": [ 160 | "## `if statement`\n", 161 | "\n", 162 | "- `if` (如果):第一個條件\n", 163 | "- `elif` (否則如果):其他條件,可以有 0~多個\n", 164 | "- `else` (否則):沒有符合前述 condition 的其他狀況,可以不使用\n", 165 | "- 每一組只會有一個(或沒有)條件成立\n", 166 | "- 記得在屁股加上 `:` (冒號)\n", 167 | "- 需要以一個縮排`indent`(實際上為四個空白),做「排版」\n", 168 | "\n", 169 | "```python\n", 170 | "if :\n", 171 | " \n", 172 | " \n", 173 | "elif :\n", 174 | " \n", 175 | "else:\n", 176 | " \n", 177 | "```" 178 | ] 179 | }, 180 | { 181 | "cell_type": "markdown", 182 | "metadata": {}, 183 | "source": [ 184 | "```\n", 185 | "如果你是電資學院:\n", 186 | " 請用手指比出 1\n", 187 | "否則如果你是管理學院:\n", 188 | " 請用手指比出 2\n", 189 | "否則:\n", 190 | " 請用手指比出 3\n", 191 | "```" 192 | ] 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "metadata": { 197 | "slideshow": { 198 | "slide_type": "subslide" 199 | } 200 | }, 201 | "source": [ 202 | "```\n", 203 | "如果你是 2000 年以前出生:\n", 204 | " 如果你是男生:\n", 205 | " 請用手指比出 1\n", 206 | " 否則如果你是女生:\n", 207 | " 請用手指比出 2\n", 208 | " \n", 209 | "否則如果你是 2000 年以後出生:\n", 210 | " 如果你是男生:\n", 211 | " 請用手指比出 3\n", 212 | " 否則如果你是女生:\n", 213 | " 請用手指比出 4\n", 214 | "```" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": { 220 | "slideshow": { 221 | "slide_type": "subslide" 222 | } 223 | }, 224 | "source": [ 225 | "![](https://www.tutorialspoint.com/scala/images/scala_decision_making.jpg)" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 9, 231 | "metadata": { 232 | "slideshow": { 233 | "slide_type": "subslide" 234 | } 235 | }, 236 | "outputs": [ 237 | { 238 | "name": "stdout", 239 | "output_type": "stream", 240 | "text": [ 241 | "is > 2\n" 242 | ] 243 | } 244 | ], 245 | "source": [ 246 | "x = 5\n", 247 | "\n", 248 | "if x > 5:\n", 249 | " print(\"is > 5\")\n", 250 | "elif x > 2:\n", 251 | " print(\"is > 2\")\n", 252 | "elif x > 0:\n", 253 | " print(\"is > 0\")\n", 254 | "else:\n", 255 | " print(\"is <= 2\")" 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": 10, 261 | "metadata": { 262 | "slideshow": { 263 | "slide_type": "subslide" 264 | } 265 | }, 266 | "outputs": [ 267 | { 268 | "name": "stdout", 269 | "output_type": "stream", 270 | "text": [ 271 | "^_^\n" 272 | ] 273 | } 274 | ], 275 | "source": [ 276 | "x = 6\n", 277 | "if x > 5:\n", 278 | " print(\"^_^\")" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": 11, 284 | "metadata": { 285 | "slideshow": { 286 | "slide_type": "subslide" 287 | } 288 | }, 289 | "outputs": [ 290 | { 291 | "name": "stdout", 292 | "output_type": "stream", 293 | "text": [ 294 | "x<=15 :)\n" 295 | ] 296 | } 297 | ], 298 | "source": [ 299 | "x = 10\n", 300 | "if x >15:\n", 301 | " print(\"x>15\")\n", 302 | "else:\n", 303 | " print(\"x<=15 :)\")" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": null, 309 | "metadata": { 310 | "slideshow": { 311 | "slide_type": "subslide" 312 | } 313 | }, 314 | "outputs": [], 315 | "source": [ 316 | "# https://www.ptt.cc/bbs/Salary/M.1496888683.A.057.html\n", 317 | "\n", 318 | "salary = int(input())\n", 319 | "\n", 320 | "if salary >= 61437:\n", 321 | " print(\"你的所得贏過 90% 的人\")\n", 322 | "elif salary >= 33502:\n", 323 | " print(\"贏過 50% 的人\")\n", 324 | "else:\n", 325 | " print(\"低於一半的人\")" 326 | ] 327 | }, 328 | { 329 | "cell_type": "markdown", 330 | "metadata": { 331 | "slideshow": { 332 | "slide_type": "subslide" 333 | } 334 | }, 335 | "source": [ 336 | "## fix bug" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": 13, 342 | "metadata": { 343 | "slideshow": { 344 | "slide_type": "-" 345 | } 346 | }, 347 | "outputs": [ 348 | { 349 | "ename": "SyntaxError", 350 | "evalue": "invalid syntax (, line 1)", 351 | "output_type": "error", 352 | "traceback": [ 353 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m if bmi>17\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" 354 | ] 355 | } 356 | ], 357 | "source": [ 358 | "if bmi>17\n", 359 | "print(\"bmi is > 5\")\n", 360 | "else\n", 361 | "print(\"bmi is <=5\")" 362 | ] 363 | }, 364 | { 365 | "cell_type": "markdown", 366 | "metadata": { 367 | "slideshow": { 368 | "slide_type": "subslide" 369 | } 370 | }, 371 | "source": [ 372 | "## fix bug" 373 | ] 374 | }, 375 | { 376 | "cell_type": "code", 377 | "execution_count": 22, 378 | "metadata": { 379 | "slideshow": { 380 | "slide_type": "-" 381 | } 382 | }, 383 | "outputs": [ 384 | { 385 | "ename": "SyntaxError", 386 | "evalue": "invalid syntax (, line 2)", 387 | "output_type": "error", 388 | "traceback": [ 389 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m if x>5\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" 390 | ] 391 | } 392 | ], 393 | "source": [ 394 | "x = 1\n", 395 | "if x>5\n", 396 | " print(\"x is > 5\")\n", 397 | "else\n", 398 | " print(\"x is <= 5\")" 399 | ] 400 | }, 401 | { 402 | "cell_type": "markdown", 403 | "metadata": { 404 | "slideshow": { 405 | "slide_type": "subslide" 406 | } 407 | }, 408 | "source": [ 409 | "## 練習:找大的\n", 410 | "\n", 411 | "輸入兩個數字,輸出比較大的那一個" 412 | ] 413 | }, 414 | { 415 | "cell_type": "code", 416 | "execution_count": null, 417 | "metadata": {}, 418 | "outputs": [], 419 | "source": [ 420 | "x = 1\n", 421 | "y = 2\n", 422 | "\n", 423 | "if # ..." 424 | ] 425 | }, 426 | { 427 | "cell_type": "markdown", 428 | "metadata": { 429 | "slideshow": { 430 | "slide_type": "subslide" 431 | } 432 | }, 433 | "source": [ 434 | "## 練習:奇偶\n", 435 | "\n", 436 | "輸入一個數,判斷他是奇數還是偶數?" 437 | ] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "execution_count": null, 442 | "metadata": {}, 443 | "outputs": [], 444 | "source": [ 445 | "number = int(input())\n", 446 | "\n", 447 | "# Do it yourself\n", 448 | "if number\n", 449 | "\n", 450 | "else" 451 | ] 452 | }, 453 | { 454 | "cell_type": "markdown", 455 | "metadata": { 456 | "slideshow": { 457 | "slide_type": "subslide" 458 | } 459 | }, 460 | "source": [ 461 | "## 練習: 等第制的成績\n", 462 | "\n", 463 | "輸入原始成績,輸出這門課得到的等地\n", 464 | "\n", 465 | "- A >= 80\n", 466 | "- B >= 70\n", 467 | "- C >= 60\n", 468 | "- D < 60" 469 | ] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "execution_count": null, 474 | "metadata": {}, 475 | "outputs": [], 476 | "source": [ 477 | "# DIY\n", 478 | "\n", 479 | "grade = # input\n", 480 | "\n", 481 | "if grade\n", 482 | "\n", 483 | "else if grade\n", 484 | "\n", 485 | "else if grade\n", 486 | "\n", 487 | "else" 488 | ] 489 | }, 490 | { 491 | "cell_type": "markdown", 492 | "metadata": { 493 | "slideshow": { 494 | "slide_type": "subslide" 495 | } 496 | }, 497 | "source": [ 498 | "## 練習: 肥宅\n", 499 | "\n", 500 | "肥宅都不運動,輸入身高(cm)、體重(kg),幫忙他算出 BMI 是多少吧,並告訴他現在的狀態是什麼八\n", 501 | "\n", 502 | "- 18.5 以下 過輕\n", 503 | "- 18.5~25 正常\n", 504 | "- 25 以上 過重\n", 505 | "\n", 506 | "如:\n", 507 | "\n", 508 | "`180` `70` -> `21.6 正常`\n", 509 | "\n", 510 | "`170` `140` -> `48.4 過重`\n", 511 | "\n", 512 | "`129.3` `129.3` -> `77.3 過重`" 513 | ] 514 | }, 515 | { 516 | "cell_type": "markdown", 517 | "metadata": { 518 | "slideshow": { 519 | "slide_type": "slide" 520 | } 521 | }, 522 | "source": [ 523 | "## 比較複雜的邏輯\n", 524 | "\n", 525 | "|運算子|作用|\n", 526 | "|--|--|\n", 527 | "|`not x`|反向邏輯(True to False,False to True)|\n", 528 | "|`a and b`||\n", 529 | "|`a or b`||\n", 530 | "|`a in b`|a 屬於 b|" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 21, 536 | "metadata": { 537 | "slideshow": { 538 | "slide_type": "subslide" 539 | } 540 | }, 541 | "outputs": [ 542 | { 543 | "name": "stdout", 544 | "output_type": "stream", 545 | "text": [ 546 | "False\n", 547 | "True\n", 548 | "False\n", 549 | "True\n" 550 | ] 551 | } 552 | ], 553 | "source": [ 554 | "print(not True)\n", 555 | "print(not False)\n", 556 | "\n", 557 | "print(True and True and False) # and: 其中有 False 就是 False\n", 558 | "\n", 559 | "print(True or False or False) # or: 其中有 True 就是 True" 560 | ] 561 | }, 562 | { 563 | "cell_type": "markdown", 564 | "metadata": {}, 565 | "source": [ 566 | "## 練習:找大的2\n", 567 | "\n", 568 | "輸入三個數字,輸出最大的那一個" 569 | ] 570 | }, 571 | { 572 | "cell_type": "code", 573 | "execution_count": null, 574 | "metadata": {}, 575 | "outputs": [], 576 | "source": [ 577 | "x = 1\n", 578 | "y = 2\n", 579 | "z = 3\n", 580 | "\n", 581 | "if #..." 582 | ] 583 | }, 584 | { 585 | "cell_type": "markdown", 586 | "metadata": { 587 | "slideshow": { 588 | "slide_type": "subslide" 589 | } 590 | }, 591 | "source": [ 592 | "## 練習:剪刀石頭布\n", 593 | "\n", 594 | "和電腦玩剪刀石頭布吧!" 595 | ] 596 | }, 597 | { 598 | "cell_type": "code", 599 | "execution_count": 2, 600 | "metadata": {}, 601 | "outputs": [ 602 | { 603 | "name": "stdout", 604 | "output_type": "stream", 605 | "text": [ 606 | "剪刀\n" 607 | ] 608 | } 609 | ], 610 | "source": [ 611 | "import random\n", 612 | "\n", 613 | "AI = random.choice(['剪','石','布']) # 電腦會隨機選一個\n", 614 | "player = input()" 615 | ] 616 | }, 617 | { 618 | "cell_type": "markdown", 619 | "metadata": { 620 | "slideshow": { 621 | "slide_type": "subslide" 622 | } 623 | }, 624 | "source": [ 625 | "## `a in b`\n", 626 | "\n", 627 | "常用在 `string`,`list`等結構中" 628 | ] 629 | }, 630 | { 631 | "cell_type": "code", 632 | "execution_count": 24, 633 | "metadata": { 634 | "slideshow": { 635 | "slide_type": "-" 636 | } 637 | }, 638 | "outputs": [ 639 | { 640 | "name": "stdout", 641 | "output_type": "stream", 642 | "text": [ 643 | "True\n", 644 | "False\n", 645 | "True\n", 646 | "True\n" 647 | ] 648 | } 649 | ], 650 | "source": [ 651 | "x = \"hello world\"\n", 652 | "print('h' in x)\n", 653 | "print('cat' in x)\n", 654 | "print('cat' not in x)\n", 655 | "print('cat' not in x or 'world' not in x)" 656 | ] 657 | }, 658 | { 659 | "cell_type": "code", 660 | "execution_count": 29, 661 | "metadata": { 662 | "slideshow": { 663 | "slide_type": "subslide" 664 | } 665 | }, 666 | "outputs": [ 667 | { 668 | "name": "stdout", 669 | "output_type": "stream", 670 | "text": [ 671 | "True\n", 672 | "False\n", 673 | "False\n" 674 | ] 675 | } 676 | ], 677 | "source": [ 678 | "fruits = ['apple','orange','banana','mango']\n", 679 | "print('apple' in fruits)\n", 680 | "print('pineapple' in fruits)\n", 681 | "print('Apple' in fruits)" 682 | ] 683 | }, 684 | { 685 | "cell_type": "code", 686 | "execution_count": null, 687 | "metadata": { 688 | "slideshow": { 689 | "slide_type": "subslide" 690 | } 691 | }, 692 | "outputs": [], 693 | "source": [ 694 | "question = input('請輸入:')\n", 695 | "\n", 696 | "if \"天氣\" in question:\n", 697 | " print(\"晴時多雲偶陣雨\")\n", 698 | "elif \"新聞\" in question:\n", 699 | " print(\"新聞都是假的\")\n", 700 | "elif \"肥宅科大\" in question:\n", 701 | " print(\"你是指台科嗎?\")\n", 702 | " \n", 703 | "elif \"謝謝\" == question:\n", 704 | " print(\"不客氣\")\n", 705 | "elif \"你好爛\" == question:\n", 706 | " print(\"抱歉,我還在學習\")\n", 707 | "else:\n", 708 | " print(\"我聽不懂你在說什麼喔\")" 709 | ] 710 | }, 711 | { 712 | "cell_type": "markdown", 713 | "metadata": { 714 | "slideshow": { 715 | "slide_type": "subslide" 716 | } 717 | }, 718 | "source": [ 719 | "## 練習:期末考\n", 720 | "\n", 721 | "為了拯救期末考,你寫了一支程式,輸入期中、作業成績,算一下期末至少要考幾分才會及格?\n", 722 | "\n", 723 | "成績占比:\n", 724 | "- 期中 30%\n", 725 | "- 期末 40%\n", 726 | "- 作業 30%\n", 727 | "\n", 728 | "\n", 729 | "- 如果不可能及格,`print(\"提早放棄\")`\n", 730 | "- 如果不用考也可以及格,`print(\"提早放假\")`" 731 | ] 732 | }, 733 | { 734 | "cell_type": "code", 735 | "execution_count": 31, 736 | "metadata": { 737 | "slideshow": { 738 | "slide_type": "-" 739 | } 740 | }, 741 | "outputs": [ 742 | { 743 | "name": "stdout", 744 | "output_type": "stream", 745 | "text": [ 746 | "0\n", 747 | "0\n" 748 | ] 749 | } 750 | ], 751 | "source": [ 752 | "midtern = int(input())\n", 753 | "homework = int(input())\n", 754 | "# do yourself" 755 | ] 756 | }, 757 | { 758 | "cell_type": "markdown", 759 | "metadata": { 760 | "slideshow": { 761 | "slide_type": "slide" 762 | } 763 | }, 764 | "source": [ 765 | "## 巢狀結構(nest)\n", 766 | "\n", 767 | "- 很多層\n", 768 | "- 只要記清楚 if 的規則,就可以很輕鬆的判斷\n", 769 | "- 不同縮排(`indent`),為不同的 if statement" 770 | ] 771 | }, 772 | { 773 | "cell_type": "code", 774 | "execution_count": null, 775 | "metadata": { 776 | "slideshow": { 777 | "slide_type": "subslide" 778 | } 779 | }, 780 | "outputs": [], 781 | "source": [ 782 | "x = 10\n", 783 | "if x > 5:\n", 784 | " print(\"x>5\")\n", 785 | " \n", 786 | " if x > 10:\n", 787 | " print(\"x>10\")\n", 788 | " else:\n", 789 | " print(\"x>5 but x<=10\")\n", 790 | "else:\n", 791 | " print(\"x<=5\")" 792 | ] 793 | }, 794 | { 795 | "cell_type": "markdown", 796 | "metadata": { 797 | "slideshow": { 798 | "slide_type": "subslide" 799 | } 800 | }, 801 | "source": [ 802 | "## fix bug\n", 803 | "\n", 804 | "- 如果有問題,判斷是不是可以解決\n", 805 | " - 可以解決:have problem in life but i can solve it\n", 806 | " - 不能解決:have problem in life but i dont know how to deal with it\n", 807 | "- 如果沒有問題:i dont have problem in life" 808 | ] 809 | }, 810 | { 811 | "cell_type": "code", 812 | "execution_count": 32, 813 | "metadata": {}, 814 | "outputs": [ 815 | { 816 | "ename": "SyntaxError", 817 | "evalue": "invalid syntax (, line 5)", 818 | "output_type": "error", 819 | "traceback": [ 820 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m if problem_in_life\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" 821 | ] 822 | } 823 | ], 824 | "source": [ 825 | "problem_in_life = True\n", 826 | "can_solve = False\n", 827 | "\n", 828 | "# fix below\n", 829 | "if problem_in_life\n", 830 | "if can_solve:\n", 831 | " print(\"have problem in life but i can solve it\")\n", 832 | "else:\n", 833 | " print(\"have problem in life and i dont know how to deal with it\")\n", 834 | "else:\n", 835 | " print(\"i dont have problem in life\")" 836 | ] 837 | }, 838 | { 839 | "cell_type": "markdown", 840 | "metadata": { 841 | "slideshow": { 842 | "slide_type": "subslide" 843 | } 844 | }, 845 | "source": [ 846 | "## 練習:閏年\n", 847 | "\n", 848 | "輸入年份:判斷是不是閏年\n", 849 | "\n", 850 | "- 西元年份除以4不可整除,為平年。\n", 851 | "- 西元年份除以4可整除,且除以100不可整除,為閏年。\n", 852 | "- 西元年份除以100可整除,且除以400不可整除,為平年\n", 853 | "- 西元年份除以400可整除,為閏年。" 854 | ] 855 | }, 856 | { 857 | "cell_type": "code", 858 | "execution_count": null, 859 | "metadata": {}, 860 | "outputs": [], 861 | "source": [] 862 | } 863 | ], 864 | "metadata": { 865 | "celltoolbar": "Slideshow", 866 | "kernelspec": { 867 | "display_name": "Python 3", 868 | "language": "python", 869 | "name": "python3" 870 | }, 871 | "language_info": { 872 | "codemirror_mode": { 873 | "name": "ipython", 874 | "version": 3 875 | }, 876 | "file_extension": ".py", 877 | "mimetype": "text/x-python", 878 | "name": "python", 879 | "nbconvert_exporter": "python", 880 | "pygments_lexer": "ipython3", 881 | "version": "3.6.5" 882 | } 883 | }, 884 | "nbformat": 4, 885 | "nbformat_minor": 2 886 | } 887 | -------------------------------------------------------------------------------- /notebooks/lecture5.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# Function & Library\n", 12 | "\n", 13 | "`臺科大程式設計研究社`\n", 14 | "\n", 15 | "`hanklu`" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "slideshow": { 22 | "slide_type": "slide" 23 | } 24 | }, 25 | "source": [ 26 | "## Function\n", 27 | "[國中數學](\"https://priori.moe.gov.tw/download/textbook/math/grade7/book2/math-7-2-7.pdf\")" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": { 33 | "slideshow": { 34 | "slide_type": "subslide" 35 | } 36 | }, 37 | "source": [ 38 | "## Function define\n", 39 | "\n", 40 | "- function 是只有你 call 他的時候才會執行的程式碼。\n", 41 | "- 將複雜的動作抽象化\n", 42 | "- 方便重複使用" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": { 48 | "slideshow": { 49 | "slide_type": "subslide" 50 | } 51 | }, 52 | "source": [ 53 | "## 人類的例子:\n", 54 | "\n", 55 | "設計冷氣的公司他把「各種控制晶片的動作」,設計成一個「按鍵」,每次我要調溫度的時候我只要 call 這個 function (按按鍵)就可以了呢。\n", 56 | "\n", 57 | "![](https://pgw.udn.com.tw/gw/photo.php?u=https://uc.udn.com.tw/photo/2018/05/22/99/4783949.jpg&x=0&y=0&sw=0&sh=0&exp=3600)" 58 | ] 59 | }, 60 | { 61 | "cell_type": "markdown", 62 | "metadata": { 63 | "slideshow": { 64 | "slide_type": "subslide" 65 | } 66 | }, 67 | "source": [ 68 | "## 其實我們已經用過很多 function 了\n", 69 | "\n", 70 | "像是: \n", 71 | "\n", 72 | "`print()` `input()` `abs()` `range()` `sum()` `max()` `min()`\n", 73 | "\n", 74 | "`s.split()` `s.replace()` `l.append()`\n", 75 | "\n", 76 | "太常用所以 python 已經幫你直接寫好了!\n", 77 | "\n", 78 | "[all builtin function!](https://docs.python.org/3/library/functions.html)" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 4, 84 | "metadata": { 85 | "slideshow": { 86 | "slide_type": "-" 87 | } 88 | }, 89 | "outputs": [ 90 | { 91 | "name": "stdout", 92 | "output_type": "stream", 93 | "text": [ 94 | "-40\n", 95 | "15\n" 96 | ] 97 | } 98 | ], 99 | "source": [ 100 | "print(-5 * abs(-8))\n", 101 | "\n", 102 | "print(sum([1,2,3,4,5]))" 103 | ] 104 | }, 105 | { 106 | "cell_type": "markdown", 107 | "metadata": { 108 | "slideshow": { 109 | "slide_type": "subslide" 110 | } 111 | }, 112 | "source": [ 113 | "\n", 114 | "- `def` (define) 開頭\n", 115 | "- `function_name` :自己命名的,和之前變數一樣,最好是個有意義的字\n", 116 | "- `()` 括號中放入參數,未來使用的時候傳入的值,就是一種變數啦\n", 117 | "- `return` 可有可無,但 function 只要遇到 `return` 就會結束,預設是 return `None`\n", 118 | "- call function 的時候的寫法就是 `function_name(x,y)`\n", 119 | "- 一樣要使用 `indent` 來排版 code block\n", 120 | "\n", 121 | "```python\n", 122 | "def function_name(x,y):\n", 123 | " \n", 124 | " \n", 125 | " return \n", 126 | "\n", 127 | "function_name(1,2)\n", 128 | "```" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 10, 134 | "metadata": { 135 | "slideshow": { 136 | "slide_type": "subslide" 137 | } 138 | }, 139 | "outputs": [ 140 | { 141 | "name": "stdout", 142 | "output_type": "stream", 143 | "text": [ 144 | "hello\n", 145 | "meow\n", 146 | "\n", 147 | "hello\n", 148 | "meow\n", 149 | "\n", 150 | "hello\n", 151 | "meow\n", 152 | "\n", 153 | "hello\n", 154 | "meow\n", 155 | "\n" 156 | ] 157 | } 158 | ], 159 | "source": [ 160 | "def say_hello():\n", 161 | " print(\"hello\")\n", 162 | " print(\"meow\\n\")\n", 163 | " \n", 164 | "say_hello()\n", 165 | "say_hello()\n", 166 | "say_hello()\n", 167 | "say_hello()" 168 | ] 169 | }, 170 | { 171 | "cell_type": "code", 172 | "execution_count": 23, 173 | "metadata": { 174 | "slideshow": { 175 | "slide_type": "-" 176 | } 177 | }, 178 | "outputs": [ 179 | { 180 | "name": "stdout", 181 | "output_type": "stream", 182 | "text": [ 183 | "hello\n", 184 | "meow\n", 185 | "\n", 186 | "None\n" 187 | ] 188 | } 189 | ], 190 | "source": [ 191 | "x = say_hello()\n", 192 | "print(x)" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": 7, 198 | "metadata": { 199 | "slideshow": { 200 | "slide_type": "subslide" 201 | } 202 | }, 203 | "outputs": [ 204 | { 205 | "ename": "TypeError", 206 | "evalue": "area() missing 1 required positional argument: 'r'", 207 | "output_type": "error", 208 | "traceback": [ 209 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 210 | "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", 211 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m3.1415926\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marea\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 212 | "\u001b[0;31mTypeError\u001b[0m: area() missing 1 required positional argument: 'r'" 213 | ] 214 | } 215 | ], 216 | "source": [ 217 | "def area(r):\n", 218 | " return r**2*3.1415926\n", 219 | "\n", 220 | "print(area())" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": 24, 226 | "metadata": { 227 | "slideshow": { 228 | "slide_type": "subslide" 229 | } 230 | }, 231 | "outputs": [ 232 | { 233 | "name": "stdout", 234 | "output_type": "stream", 235 | "text": [ 236 | "閏年\n", 237 | "閏年\n", 238 | "平年\n", 239 | "閏年\n" 240 | ] 241 | } 242 | ], 243 | "source": [ 244 | "def leap_year(y):\n", 245 | " if ((y % 4 == 0 and y % 100 != 0) or (y % 400 == 0 and y % 3200 != 0)):\n", 246 | " print(\"閏年\")\n", 247 | " else:\n", 248 | " print(\"平年\")\n", 249 | " \n", 250 | "leap_year(2000)\n", 251 | "leap_year(2020)\n", 252 | "leap_year(1997)\n", 253 | "leap_year(1888)" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": 27, 259 | "metadata": { 260 | "slideshow": { 261 | "slide_type": "subslide" 262 | } 263 | }, 264 | "outputs": [ 265 | { 266 | "name": "stdout", 267 | "output_type": "stream", 268 | "text": [ 269 | "None\n", 270 | "None\n" 271 | ] 272 | } 273 | ], 274 | "source": [ 275 | "def newton_second_law(m,a):\n", 276 | " f = m*a\n", 277 | "\n", 278 | "print(newton_second_law(2,3))\n", 279 | "print(newton_second_law(100,200))" 280 | ] 281 | }, 282 | { 283 | "cell_type": "markdown", 284 | "metadata": { 285 | "slideshow": { 286 | "slide_type": "subslide" 287 | } 288 | }, 289 | "source": [ 290 | "![](https://i.imgur.com/JsO23sR.png)" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": { 296 | "slideshow": { 297 | "slide_type": "subslide" 298 | } 299 | }, 300 | "source": [ 301 | "## 為什麼要寫function:好的設計" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": 22, 307 | "metadata": {}, 308 | "outputs": [ 309 | { 310 | "name": "stdout", 311 | "output_type": "stream", 312 | "text": [ 313 | "['nctu', 'ntust', 'ntust']\n", 314 | "['nchu', 'nctu', 'ntu', 'nchu', 'ntust', 'nchu']\n", 315 | "['ntu', 'ntust', 'nchu', 'nctu']\n" 316 | ] 317 | } 318 | ], 319 | "source": [ 320 | "mail_list1= [\"B10908106@m.nctu.edu.tw\", \"A10512047@mail.ntust.edu.tw\", \"B10926062@mail.ntust.edu.tw\"]\n", 321 | "mail_list2= [\"A10627133@nchu.edu.tw\", \"B10302119@m.nctu.edu.tw\", \"A10123186@ntu.edu.tw\", \"B10224003@nchu.edu.tw\", \"B10129192@mail.ntust.edu.tw\", \"B10019112@nchu.edu.tw\"]\n", 322 | "mail_list3 = [\"B10811042@ntu.edu.tw\", \"A10811075@mail.ntust.edu.tw\", \"B10719186@nchu.edu.tw\", \"B10708071@m.nctu.edu.tw\"]\n", 323 | "\n", 324 | "school_list1 = []\n", 325 | "for mail in mail_list1:\n", 326 | " school = mail.split(\"@\")[1].split(\".\")[-3]\n", 327 | " school_list1.append(school)\n", 328 | "\n", 329 | "school_list2 = []\n", 330 | "for mail in mail_list2:\n", 331 | " school = mail.split(\"@\")[1].split(\".\")[-3]\n", 332 | " school_list2.append(school)\n", 333 | "\n", 334 | "school_list3 = []\n", 335 | "for mail in mail_list3:\n", 336 | " school = mail.split(\"@\")[1].split(\".\")[-3]\n", 337 | " school_list3.append(school)\n", 338 | "\n", 339 | "print(school_list1)\n", 340 | "print(school_list2)\n", 341 | "print(school_list3)" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 21, 347 | "metadata": { 348 | "slideshow": { 349 | "slide_type": "subslide" 350 | } 351 | }, 352 | "outputs": [ 353 | { 354 | "name": "stdout", 355 | "output_type": "stream", 356 | "text": [ 357 | "['nctu', 'ntust', 'ntust']\n", 358 | "['nchu', 'nctu', 'ntu', 'nchu', 'ntust', 'nchu']\n", 359 | "['ntu', 'ntust', 'nchu', 'nctu']\n" 360 | ] 361 | } 362 | ], 363 | "source": [ 364 | "def extract_school(mail_list):\n", 365 | " school_list = []\n", 366 | " for mail in mail_list:\n", 367 | " school = mail.split(\"@\")[1].split(\".\")[-3]\n", 368 | " school_list.append(school)\n", 369 | " return school_list\n", 370 | " \n", 371 | "school_list1 = extract_school(mail_list1)\n", 372 | "school_list2 = extract_school(mail_list2)\n", 373 | "school_list3 = extract_school(mail_list3)\n", 374 | "\n", 375 | "print(school_list1)\n", 376 | "print(school_list2)\n", 377 | "print(school_list3)" 378 | ] 379 | }, 380 | { 381 | "cell_type": "markdown", 382 | "metadata": { 383 | "slideshow": { 384 | "slide_type": "subslide" 385 | } 386 | }, 387 | "source": [ 388 | "## 練習:扇形面積\n", 389 | "\n", 390 | "設計一個 function 當傳入 `半徑` 和 `角度` 的時候, `return` 該扇形的面積\n" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 74, 396 | "metadata": {}, 397 | "outputs": [ 398 | { 399 | "ename": "TypeError", 400 | "evalue": "area() takes 0 positional arguments but 2 were given", 401 | "output_type": "error", 402 | "traceback": [ 403 | "\u001b[0;31m---------------------------------------------------------------\u001b[0m", 404 | "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", 405 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marea\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m90\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marea\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m180\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marea\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m360\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 406 | "\u001b[0;31mTypeError\u001b[0m: area() takes 0 positional arguments but 2 were given" 407 | ] 408 | } 409 | ], 410 | "source": [ 411 | "def area():\n", 412 | " # do something\n", 413 | " return \n", 414 | "\n", 415 | "print(area(3,90))\n", 416 | "print(area(4,180))\n", 417 | "print(area(10,360))" 418 | ] 419 | }, 420 | { 421 | "cell_type": "markdown", 422 | "metadata": { 423 | "slideshow": { 424 | "slide_type": "subslide" 425 | } 426 | }, 427 | "source": [ 428 | "## 練習:平均\n", 429 | "\n", 430 | "傳入一個 list `return` 該 list 裡的值的平均值" 431 | ] 432 | }, 433 | { 434 | "cell_type": "code", 435 | "execution_count": 67, 436 | "metadata": { 437 | "slideshow": { 438 | "slide_type": "-" 439 | } 440 | }, 441 | "outputs": [ 442 | { 443 | "ename": "SyntaxError", 444 | "evalue": "invalid syntax (, line 2)", 445 | "output_type": "error", 446 | "traceback": [ 447 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m for ...\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" 448 | ] 449 | } 450 | ], 451 | "source": [ 452 | "def mean():\n", 453 | " for ...\n", 454 | " # do something\n", 455 | " return\n", 456 | "\n", 457 | "print(mean([1,2,3,4,5]))\n", 458 | "print(mean([4,4,4,4,4,4,4]))\n", 459 | "print(mean([88,90,92,100,102,103]))" 460 | ] 461 | }, 462 | { 463 | "cell_type": "markdown", 464 | "metadata": { 465 | "slideshow": { 466 | "slide_type": "slide" 467 | } 468 | }, 469 | "source": [ 470 | "## argument 也可以有預設值\n", 471 | "\n", 472 | "### positional argument\n", 473 | "\n", 474 | "- call function 時要按照順序\n", 475 | "\n", 476 | "### default argiment\n", 477 | "- 一定要在 positional argument 之後\n", 478 | "- 只要 call function 時有傳入,就會被蓋掉\n", 479 | "- call function 若傳入時沒有指定名稱的話,也是按照順序\n", 480 | "\n", 481 | "" 482 | ] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "execution_count": 47, 487 | "metadata": { 488 | "slideshow": { 489 | "slide_type": "subslide" 490 | } 491 | }, 492 | "outputs": [ 493 | { 494 | "name": "stdout", 495 | "output_type": "stream", 496 | "text": [ 497 | "hello! hank good bye!\n", 498 | "meow!! mary wwwwwwww\n", 499 | "hey!!! mary see you!\n" 500 | ] 501 | } 502 | ], 503 | "source": [ 504 | "def say_hello(name,start_msg=\"hello!\",end_msg=\"good bye!\"):\n", 505 | " print(start_msg,name,end_msg)\n", 506 | "\n", 507 | "say_hello(\"hank\") # 沒有傳入\n", 508 | "say_hello(\"mary\",end_msg=\"wwwwwwww\",start_msg=\"meow!!\") # 以名稱傳入\n", 509 | "say_hello(\"mary\",\"hey!!!\",\"see you!\") # 以位置傳入" 510 | ] 511 | }, 512 | { 513 | "cell_type": "markdown", 514 | "metadata": { 515 | "slideshow": { 516 | "slide_type": "slide" 517 | } 518 | }, 519 | "source": [ 520 | "## Library( Module, Package)\n", 521 | "\n", 522 | "- 站在巨人的肩膀上\n", 523 | "- 不要重複造輪子 [wiki](https://zh.wikipedia.org/wiki/%E9%87%8D%E9%80%A0%E8%BD%AE%E5%AD%90)\n", 524 | "- [What is the difference between Python modules, packages, libraries, and frameworks?](https://www.quora.com/What-is-the-difference-between-Python-modules-packages-libraries-and-frameworks)\n", 525 | "\n", 526 | "![](https://case.ntu.edu.tw/blog/wp-content/uploads/2018/03/479748503_m.jpg)" 527 | ] 528 | }, 529 | { 530 | "cell_type": "markdown", 531 | "metadata": { 532 | "slideshow": { 533 | "slide_type": "subslide" 534 | } 535 | }, 536 | "source": [ 537 | "`Library, module, package` 就是別人寫的程式碼,我們可以把他下載下來用\n", 538 | "\n", 539 | "或是 [builtin module](https://docs.python.org/3/py-modindex.html)" 540 | ] 541 | }, 542 | { 543 | "cell_type": "markdown", 544 | "metadata": { 545 | "slideshow": { 546 | "slide_type": "subslide" 547 | } 548 | }, 549 | "source": [ 550 | "## import\n", 551 | "\n", 552 | "- 兩種 import 方式\n", 553 | "- 沒有 import 不能用,通常會放在程式碼的最上面\n", 554 | "- Google google google!\n", 555 | "\n", 556 | "```python\n", 557 | "import a\n", 558 | "\n", 559 | "from a import b\n", 560 | "```" 561 | ] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": 75, 566 | "metadata": { 567 | "slideshow": { 568 | "slide_type": "subslide" 569 | } 570 | }, 571 | "outputs": [ 572 | { 573 | "ename": "ModuleNotFoundError", 574 | "evalue": "No module named 'xxx'", 575 | "output_type": "error", 576 | "traceback": [ 577 | "\u001b[0;31m---------------------------------------------------------------\u001b[0m", 578 | "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", 579 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mxxx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mxxx\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mxxx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 580 | "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'xxx'" 581 | ] 582 | } 583 | ], 584 | "source": [ 585 | "import xxx" 586 | ] 587 | }, 588 | { 589 | "cell_type": "code", 590 | "execution_count": 78, 591 | "metadata": {}, 592 | "outputs": [ 593 | { 594 | "ename": "ModuleNotFoundError", 595 | "evalue": "No module named 'xxx'", 596 | "output_type": "error", 597 | "traceback": [ 598 | "\u001b[0;31m---------------------------------------------------------------\u001b[0m", 599 | "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", 600 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mxxx\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0myyy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 601 | "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'xxx'" 602 | ] 603 | } 604 | ], 605 | "source": [ 606 | "from xxx import yyy" 607 | ] 608 | }, 609 | { 610 | "cell_type": "code", 611 | "execution_count": 85, 612 | "metadata": { 613 | "slideshow": { 614 | "slide_type": "subslide" 615 | } 616 | }, 617 | "outputs": [ 618 | { 619 | "name": "stdout", 620 | "output_type": "stream", 621 | "text": [ 622 | "47\n", 623 | "orange\n", 624 | "53\n", 625 | "apple\n", 626 | "30\n", 627 | "apple\n", 628 | "56\n", 629 | "mango\n", 630 | "15\n", 631 | "apple\n" 632 | ] 633 | } 634 | ], 635 | "source": [ 636 | "import random\n", 637 | "\n", 638 | "for i in range(5):\n", 639 | " print(random.randint(1,100) )\n", 640 | " print(random.choice([\"apple\",\"mango\",\"orange\"]))" 641 | ] 642 | }, 643 | { 644 | "cell_type": "markdown", 645 | "metadata": { 646 | "slideshow": { 647 | "slide_type": "subslide" 648 | } 649 | }, 650 | "source": [ 651 | "[math 的 document](https://docs.python.org/3/library/math.html)\n", 652 | "\n", 653 | "[random 的 document](https://docs.python.org/3/library/random.html)\n", 654 | "\n", 655 | "Source Code?!\n", 656 | "\n", 657 | "> my Mac: /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6" 658 | ] 659 | }, 660 | { 661 | "cell_type": "code", 662 | "execution_count": 58, 663 | "metadata": { 664 | "slideshow": { 665 | "slide_type": "-" 666 | } 667 | }, 668 | "outputs": [ 669 | { 670 | "name": "stdout", 671 | "output_type": "stream", 672 | "text": [ 673 | "3.141592653589793\n", 674 | "0.1411200080598672\n", 675 | "2.302585092994046\n" 676 | ] 677 | } 678 | ], 679 | "source": [ 680 | "import math\n", 681 | "\n", 682 | "print(math.pi)\n", 683 | "print(math.sin(3))\n", 684 | "print(math.log(10))" 685 | ] 686 | }, 687 | { 688 | "cell_type": "code", 689 | "execution_count": 60, 690 | "metadata": { 691 | "slideshow": { 692 | "slide_type": "subslide" 693 | } 694 | }, 695 | "outputs": [ 696 | { 697 | "name": "stdout", 698 | "output_type": "stream", 699 | "text": [ 700 | "3.141592653589793\n", 701 | "0.1411200080598672\n", 702 | "2.302585092994046\n" 703 | ] 704 | } 705 | ], 706 | "source": [ 707 | "from math import pi, sin, log\n", 708 | "\n", 709 | "print(pi)\n", 710 | "print(sin(3))\n", 711 | "print(log(10))" 712 | ] 713 | }, 714 | { 715 | "cell_type": "markdown", 716 | "metadata": { 717 | "slideshow": { 718 | "slide_type": "subslide" 719 | } 720 | }, 721 | "source": [ 722 | "## 練習:快放暑假了!\n", 723 | "\n", 724 | "python 裡面有一個跟日期相關的 library ,能不能請你使用 google 來找到他,並用 python 算一下`今天`距離 `2100 年的 7 月 1 日`還有幾天呢?" 725 | ] 726 | }, 727 | { 728 | "cell_type": "code", 729 | "execution_count": null, 730 | "metadata": {}, 731 | "outputs": [], 732 | "source": [] 733 | } 734 | ], 735 | "metadata": { 736 | "celltoolbar": "Slideshow", 737 | "kernelspec": { 738 | "display_name": "Python 3", 739 | "language": "python", 740 | "name": "python3" 741 | }, 742 | "language_info": { 743 | "codemirror_mode": { 744 | "name": "ipython", 745 | "version": 3 746 | }, 747 | "file_extension": ".py", 748 | "mimetype": "text/x-python", 749 | "name": "python", 750 | "nbconvert_exporter": "python", 751 | "pygments_lexer": "ipython3", 752 | "version": "3.6.5" 753 | } 754 | }, 755 | "nbformat": 4, 756 | "nbformat_minor": 2 757 | } 758 | -------------------------------------------------------------------------------- /notebooks/lecture6.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# 實際的例子 -- 爬蟲\n", 12 | "\n", 13 | "`hanklu` `臺科大程式設計社`" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "slideshow": { 20 | "slide_type": "slide" 21 | } 22 | }, 23 | "source": [ 24 | "## 快速複習\n", 25 | "\n", 26 | "我們前幾週的課程裡面介紹了,並寫了一些不太有趣的練習題\n", 27 | "\n", 28 | "- variable and its type\n", 29 | "- if/else\n", 30 | "- loop\n", 31 | " - while\n", 32 | " - for\n", 33 | "- define function\n", 34 | "- import" 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": { 40 | "slideshow": { 41 | "slide_type": "subslide" 42 | } 43 | }, 44 | "source": [ 45 | "`int`, `float`, `str`, `list`, `dict`\n", 46 | "![](https://i.imgur.com/FstpeaU.png)" 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": { 52 | "slideshow": { 53 | "slide_type": "subslide" 54 | } 55 | }, 56 | "source": [ 57 | "## `if statement`\n", 58 | "\n", 59 | "- `if` (如果):第一個條件\n", 60 | "- `elif` (否則如果):其他條件,可以有 0~多個\n", 61 | "- `else` (否則):沒有符合前述 condition 的其他狀況,可以不使用\n", 62 | "- 每一組只會有一個(或沒有)條件成立\n", 63 | "- 記得在屁股加上 `:` (冒號)\n", 64 | "- 需要以一個縮排`indent`(實際上為四個空白),做「排版」\n", 65 | "\n", 66 | "```python\n", 67 | "if :\n", 68 | " \n", 69 | " \n", 70 | "elif :\n", 71 | " \n", 72 | "else:\n", 73 | " \n", 74 | "```" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": { 80 | "slideshow": { 81 | "slide_type": "subslide" 82 | } 83 | }, 84 | "source": [ 85 | "## While Loop\n", 86 | "\n", 87 | "- 當條件成立,就執行 block 裡面的程式碼,之後再回到while開頭再問一次條件是否成立\n", 88 | "- 條件不成立,就不執行 block 裡面的程式碼\n", 89 | "- while 的屁股要加上 `:` (冒號)\n", 90 | "- 記得用縮排 `indent` 當作 block\n", 91 | "\n", 92 | "```python\n", 93 | "while :\n", 94 | " \n", 95 | " \n", 96 | "```" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "slideshow": { 103 | "slide_type": "subslide" 104 | } 105 | }, 106 | "source": [ 107 | "# for loop\n", 108 | "\n", 109 | "- 遍歷整個 sequence ,每次 loop 拿出一個東西\n", 110 | "- 也一樣要用 `indent` 排版出 `block`\n", 111 | "- 後面要加上 `:`(冒號)\n", 112 | "- 和 `while` 一樣可以 `break` 和 `continue`\n", 113 | "\n", 114 | "```python\n", 115 | "for in :\n", 116 | " \n", 117 | " \n", 118 | "```" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": { 124 | "slideshow": { 125 | "slide_type": "subslide" 126 | } 127 | }, 128 | "source": [ 129 | "## define function\n", 130 | "- `def` (define) 開頭\n", 131 | "- `function_name` :自己命名的,和之前變數一樣,最好是個有意義的字\n", 132 | "- `()` 括號中放入參數,未來使用的時候傳入的值,就是一種變數啦\n", 133 | "- `return` 可有可無,但 function 只要遇到 `return` 就會結束,預設是 return `None`\n", 134 | "- call function 的時候的寫法就是 `function_name(x,y)`\n", 135 | "- 一樣要使用 `indent` 來排版 code block\n", 136 | "\n", 137 | "```python\n", 138 | "def function_name(x,y):\n", 139 | " \n", 140 | " \n", 141 | " return \n", 142 | "\n", 143 | "function_name(1,2)\n", 144 | "```" 145 | ] 146 | }, 147 | { 148 | "cell_type": "markdown", 149 | "metadata": { 150 | "slideshow": { 151 | "slide_type": "slide" 152 | } 153 | }, 154 | "source": [ 155 | "## Class 類別\n", 156 | "\n", 157 | "(補充一個不需要實際寫,但要會用的概念)" 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": { 163 | "slideshow": { 164 | "slide_type": "subslide" 165 | } 166 | }, 167 | "source": [ 168 | "我們之前學過的 `int`, `float`, `str`, `list`, `dict` 是 python 內建的型別\n", 169 | "\n", 170 | "當然也可以自己設計其他東西" 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": { 176 | "slideshow": { 177 | "slide_type": "-" 178 | } 179 | }, 180 | "source": [ 181 | "" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": 4, 187 | "metadata": { 188 | "slideshow": { 189 | "slide_type": "subslide" 190 | } 191 | }, 192 | "outputs": [ 193 | { 194 | "name": "stdout", 195 | "output_type": "stream", 196 | "text": [ 197 | "\n", 198 | "\n" 199 | ] 200 | } 201 | ], 202 | "source": [ 203 | "x = 1\n", 204 | "print(type(x))\n", 205 | "\n", 206 | "y = \"hello world\"\n", 207 | "print(type(y))" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": 11, 213 | "metadata": { 214 | "slideshow": { 215 | "slide_type": "-" 216 | } 217 | }, 218 | "outputs": [ 219 | { 220 | "name": "stdout", 221 | "output_type": "stream", 222 | "text": [ 223 | "2019-04-08 21:02:59.920589\n", 224 | "\n" 225 | ] 226 | } 227 | ], 228 | "source": [ 229 | "import datetime\n", 230 | "today = datetime.datetime.today()\n", 231 | "print(today)\n", 232 | "print(type(today)) # today 是一個 datetime 的 object" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 26, 238 | "metadata": { 239 | "slideshow": { 240 | "slide_type": "subslide" 241 | } 242 | }, 243 | "outputs": [ 244 | { 245 | "name": "stdout", 246 | "output_type": "stream", 247 | "text": [ 248 | "hi~ world\n", 249 | "['hello', 'world']\n" 250 | ] 251 | } 252 | ], 253 | "source": [ 254 | "x = \"hello world\"\n", 255 | "print(x.replace(\"hello\", \"hi~\"))\n", 256 | "print(x.split())" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 27, 262 | "metadata": { 263 | "slideshow": { 264 | "slide_type": "-" 265 | } 266 | }, 267 | "outputs": [ 268 | { 269 | "name": "stdout", 270 | "output_type": "stream", 271 | "text": [ 272 | "\n", 273 | "2019 / 04 / 08\n", 274 | "8\n" 275 | ] 276 | } 277 | ], 278 | "source": [ 279 | "import datetime\n", 280 | "today = datetime.datetime.today()\n", 281 | "\n", 282 | "print(type(today))\n", 283 | "print(today.strftime(\"%Y / %m / %d\")) # method\n", 284 | "print(today.day) # attribute" 285 | ] 286 | }, 287 | { 288 | "cell_type": "markdown", 289 | "metadata": { 290 | "slideshow": { 291 | "slide_type": "slide" 292 | } 293 | }, 294 | "source": [ 295 | "## 網頁爬蟲\n", 296 | "\n", 297 | "一言以敝之:用 python 把從網路上抓取資料的動作自動化。\n", 298 | "\n", 299 | "- 資料是一種資產\n", 300 | "- 搜集資料很麻煩,只有少部分的資料被打包好了(政府 PM2.5 歷史資料...)" 301 | ] 302 | }, 303 | { 304 | "cell_type": "markdown", 305 | "metadata": { 306 | "slideshow": { 307 | "slide_type": "subslide" 308 | } 309 | }, 310 | "source": [ 311 | "一個一般的網頁,裡面包含了我想要取得的資料,但是沒人幫我整理好QQ\n", 312 | "\n", 313 | "![](https://i.imgur.com/Zq92L0t.png)" 314 | ] 315 | }, 316 | { 317 | "cell_type": "markdown", 318 | "metadata": { 319 | "slideshow": { 320 | "slide_type": "subslide" 321 | } 322 | }, 323 | "source": [ 324 | "\n", 325 | "[pokemon](https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_base_stats_(Generation_VII-present))\n", 326 | "![](https://i.imgur.com/oc0SEkG.png)" 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": { 332 | "slideshow": { 333 | "slide_type": "slide" 334 | } 335 | }, 336 | "source": [ 337 | "## 基礎觀念\n", 338 | "\n", 339 | "簡單的爬蟲程式分成兩個部分\n", 340 | "\n", 341 | "- 抓取網頁內容\n", 342 | "- 分析" 343 | ] 344 | }, 345 | { 346 | "cell_type": "markdown", 347 | "metadata": { 348 | "slideshow": { 349 | "slide_type": "subslide" 350 | } 351 | }, 352 | "source": [ 353 | "## 抓取網頁內容\n", 354 | "\n", 355 | "`F12` or `⌘+⌥+i` 可以在 chorme 上看到網頁原始碼\n", 356 | "\n", 357 | "![](https://i.imgur.com/AkgHXm0.png)" 358 | ] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "metadata": { 363 | "slideshow": { 364 | "slide_type": "subslide" 365 | } 366 | }, 367 | "source": [ 368 | "![](https://i.imgur.com/0omTufK.png)" 369 | ] 370 | }, 371 | { 372 | "cell_type": "markdown", 373 | "metadata": { 374 | "slideshow": { 375 | "slide_type": "subslide" 376 | } 377 | }, 378 | "source": [ 379 | "## 先安裝一下需要的套件:" 380 | ] 381 | }, 382 | { 383 | "cell_type": "code", 384 | "execution_count": 1, 385 | "metadata": { 386 | "slideshow": { 387 | "slide_type": "-" 388 | } 389 | }, 390 | "outputs": [ 391 | { 392 | "name": "stdout", 393 | "output_type": "stream", 394 | "text": [ 395 | "Requirement already satisfied: requests in /Users/hank/.virtualenvs/DL/lib/python3.6/site-packages (2.18.4)\n", 396 | "Requirement already satisfied: idna<2.7,>=2.5 in /Users/hank/.virtualenvs/DL/lib/python3.6/site-packages (from requests) (2.6)\n", 397 | "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /Users/hank/.virtualenvs/DL/lib/python3.6/site-packages (from requests) (3.0.4)\n", 398 | "Requirement already satisfied: urllib3<1.23,>=1.21.1 in /Users/hank/.virtualenvs/DL/lib/python3.6/site-packages (from requests) (1.22)\n", 399 | "Requirement already satisfied: certifi>=2017.4.17 in /Users/hank/.virtualenvs/DL/lib/python3.6/site-packages (from requests) (2018.4.16)\n", 400 | "\u001b[33mYou are using pip version 10.0.0, however version 19.0.3 is available.\n", 401 | "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n", 402 | "Requirement already satisfied: bs4 in /Users/hank/.virtualenvs/DL/lib/python3.6/site-packages (0.0.1)\n", 403 | "Requirement already satisfied: beautifulsoup4 in /Users/hank/.virtualenvs/DL/lib/python3.6/site-packages (from bs4) (4.6.0)\n", 404 | "\u001b[33mYou are using pip version 10.0.0, however version 19.0.3 is available.\n", 405 | "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n" 406 | ] 407 | } 408 | ], 409 | "source": [ 410 | "# install package\n", 411 | "!pip install requests\n", 412 | "!pip install bs4\n", 413 | "\n", 414 | "# or run command in terminal" 415 | ] 416 | }, 417 | { 418 | "cell_type": "code", 419 | "execution_count": 35, 420 | "metadata": { 421 | "slideshow": { 422 | "slide_type": "subslide" 423 | } 424 | }, 425 | "outputs": [ 426 | { 427 | "name": "stdout", 428 | "output_type": "stream", 429 | "text": [ 430 | "\n" 431 | ] 432 | } 433 | ], 434 | "source": [ 435 | "import requests\n", 436 | "\n", 437 | "resp = requests.get(\"https://hanklu.tw/python/example\")\n", 438 | "print(resp)" 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": 36, 444 | "metadata": { 445 | "slideshow": { 446 | "slide_type": "-" 447 | } 448 | }, 449 | "outputs": [ 450 | { 451 | "name": "stdout", 452 | "output_type": "stream", 453 | "text": [ 454 | "

hello world

\n", 455 | "

here is some HTML code

\n", 456 | "
\n", 457 | "

have a nice day

\n", 458 | "
\n" 459 | ] 460 | } 461 | ], 462 | "source": [ 463 | "print(resp.text)" 464 | ] 465 | }, 466 | { 467 | "cell_type": "markdown", 468 | "metadata": { 469 | "slideshow": { 470 | "slide_type": "subslide" 471 | } 472 | }, 473 | "source": [ 474 | "## 分析網頁內容(萃取)\n", 475 | "\n", 476 | "使用 BeautifulSoup" 477 | ] 478 | }, 479 | { 480 | "cell_type": "markdown", 481 | "metadata": { 482 | "slideshow": { 483 | "slide_type": "subslide" 484 | } 485 | }, 486 | "source": [ 487 | "## 補充資料:\n", 488 | "[HTML x CSS 超☆入門](https://docs.google.com/presentation/d/1Yn1rXAKOwj_VUDmnL8Mvhnj6hU0KCSoZW-D_aLHYizA)\n", 489 | "\n", 490 | "[HTML Tree](https://docs.google.com/presentation/d/1OJL6nstGJuCHPw0fIED3y-biRu63qt_6qcSpXYjK3ys)" 491 | ] 492 | }, 493 | { 494 | "cell_type": "markdown", 495 | "metadata": { 496 | "slideshow": { 497 | "slide_type": "subslide" 498 | } 499 | }, 500 | "source": [ 501 | "" 502 | ] 503 | }, 504 | { 505 | "cell_type": "code", 506 | "execution_count": 38, 507 | "metadata": { 508 | "scrolled": true, 509 | "slideshow": { 510 | "slide_type": "-" 511 | } 512 | }, 513 | "outputs": [ 514 | { 515 | "name": "stdout", 516 | "output_type": "stream", 517 | "text": [ 518 | "\n", 519 | "\n", 520 | "\n", 521 | "\n", 522 | "\n", 523 | " \n", 524 | " \n", 525 | " Coodle\n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | "\n", 534 | "\n", 535 | "\n", 536 | "\n", 537 | " \n", 538 | "\n", 593 | "\n", 594 | " \n", 595 | "\n", 596 | "
\n", 597 | " \n", 598 | "\n", 599 | "\n", 600 | "\n", 601 | "\n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | "\n", 724 | "
標題描述出題者最後修改
L5 平均mean匿名小飛象章魚March 26, 2019, 7:48 a.m.
L5 扇形面積算一下面積匿名小飛象章魚March 26, 2019, 7:47 a.m.
L5 快放暑假了!還有多久放暑假呢匿名小飛象章魚March 26, 2019, 7:46 a.m.
L4 有趣的質數找一下質數匿名小飛象章魚March 19, 2019, 9:20 a.m.
L4 阿姆斯壯數Armstrong匿名小飛象章魚March 19, 2019, 9:22 a.m.
L4 很多信箱處理一下資料吧匿名小飛象章魚March 19, 2019, 9:17 a.m.
L4 99 乘法表印出一個九九乘法表吧匿名小飛象章魚March 19, 2019, 9:15 a.m.
L4 fizz buzz匿名小飛象章魚March 19, 2019, 9:13 a.m.
L4 GPA 計算機想快點知道 GPA 是多少呢匿名小飛象章魚March 19, 2019, 9:10 a.m.
L4 1~10000的和Σ(x=1,10000) x匿名小飛象章魚March 19, 2019, 9:09 a.m.
L4 成績等第制將輸入的成績轉換成等第制匿名小飛象章魚March 19, 2019, 12:14 p.m.
L3 閏年判斷是不是閏年匿名小飛象章魚March 19, 2019, 9:07 a.m.
L3 期末考為了拯救期末考,你寫了一支程式匿名小飛象章魚March 19, 2019, 9:07 a.m.
L3 剪刀石頭布和電腦玩剪刀石頭布吧匿名小飛象章魚March 19, 2019, 9:07 a.m.
L3 找大的2輸入三個數字,輸出最大的那個數字匿名小飛象章魚March 19, 2019, 9:07 a.m.
HW1 奇數偶數if else 練習題匿名小飛象章魚March 13, 2019, 7:53 a.m.
\n", 725 | "\n", 726 | "\n", 727 | "
\n", 728 | "\n", 729 | " \n", 730 | "\n", 731 | "\n", 732 | "\n", 733 | "\n", 734 | "\n", 735 | "\n", 736 | "\n", 751 | "\n", 752 | "\n" 753 | ] 754 | } 755 | ], 756 | "source": [ 757 | "import requests\n", 758 | "from bs4 import BeautifulSoup\n", 759 | "\n", 760 | "# 抓取網頁內容\n", 761 | "resp = requests.get(\"https://coodle.hanklu.tw/problem/\")\n", 762 | "html = resp.text\n", 763 | "print(html)" 764 | ] 765 | }, 766 | { 767 | "cell_type": "code", 768 | "execution_count": 40, 769 | "metadata": { 770 | "slideshow": { 771 | "slide_type": "subslide" 772 | } 773 | }, 774 | "outputs": [ 775 | { 776 | "name": "stdout", 777 | "output_type": "stream", 778 | "text": [ 779 | "\n" 780 | ] 781 | } 782 | ], 783 | "source": [ 784 | "bs = BeautifulSoup(html,'html.parser')\n", 785 | "print(type(bs))" 786 | ] 787 | }, 788 | { 789 | "cell_type": "code", 790 | "execution_count": 49, 791 | "metadata": { 792 | "slideshow": { 793 | "slide_type": "subslide" 794 | } 795 | }, 796 | "outputs": [ 797 | { 798 | "name": "stdout", 799 | "output_type": "stream", 800 | "text": [ 801 | "Coodle\n", 802 | "Coodle\n" 803 | ] 804 | } 805 | ], 806 | "source": [ 807 | "print(bs.title) # tag\n", 808 | "print(bs.title.text) # tag中的純文字" 809 | ] 810 | }, 811 | { 812 | "cell_type": "code", 813 | "execution_count": 50, 814 | "metadata": { 815 | "scrolled": true, 816 | "slideshow": { 817 | "slide_type": "subslide" 818 | } 819 | }, 820 | "outputs": [ 821 | { 822 | "name": "stdout", 823 | "output_type": "stream", 824 | "text": [ 825 | "\n", 826 | "\n", 827 | "\n", 828 | "\n", 829 | "\n", 830 | "\n", 831 | "\n", 832 | "\n", 833 | "\n", 834 | "\n", 835 | "\n", 836 | "\n", 837 | "\n", 838 | "\n", 839 | "\n", 840 | "\n", 841 | "\n", 842 | "\n", 843 | "\n", 844 | "\n", 845 | "\n", 846 | "\n", 847 | "\n", 848 | "\n", 849 | "\n", 850 | "\n", 851 | "\n", 852 | "\n", 853 | "\n", 854 | "\n", 855 | "\n", 856 | "\n", 857 | "\n", 858 | "\n", 859 | "\n", 860 | "\n", 861 | "\n", 862 | "\n", 863 | "\n", 864 | "\n", 865 | "\n", 866 | "\n", 867 | "\n", 868 | "\n", 869 | "\n", 870 | "\n", 871 | "\n", 872 | "\n", 873 | "\n", 874 | "\n", 875 | "\n", 876 | "\n", 877 | "\n", 878 | "\n", 879 | "\n", 880 | "\n", 881 | "\n", 882 | "\n", 883 | "\n", 884 | "\n", 885 | "\n", 886 | "\n", 887 | "\n", 888 | "\n", 889 | "\n", 890 | "\n", 891 | "\n", 892 | "\n", 893 | "\n", 894 | "\n", 895 | "\n", 896 | "\n", 897 | "\n", 898 | "\n", 899 | "\n", 900 | "\n", 901 | "\n", 902 | "\n", 903 | "\n", 904 | "\n", 905 | "\n", 906 | "\n", 907 | "\n", 908 | "\n", 909 | "\n", 910 | "\n", 911 | "\n", 912 | "\n", 913 | "\n", 914 | "\n", 915 | "\n", 916 | "\n", 917 | "\n", 918 | "\n", 919 | "\n", 920 | "\n", 921 | "\n", 922 | "\n", 923 | "\n", 924 | "\n", 925 | "\n", 926 | "\n", 927 | "\n", 928 | "\n", 929 | "\n", 930 | "
標題描述出題者最後修改
L5 平均mean匿名小飛象章魚March 26, 2019, 7:48 a.m.
L5 扇形面積算一下面積匿名小飛象章魚March 26, 2019, 7:47 a.m.
L5 快放暑假了!還有多久放暑假呢匿名小飛象章魚March 26, 2019, 7:46 a.m.
L4 有趣的質數找一下質數匿名小飛象章魚March 19, 2019, 9:20 a.m.
L4 阿姆斯壯數Armstrong匿名小飛象章魚March 19, 2019, 9:22 a.m.
L4 很多信箱處理一下資料吧匿名小飛象章魚March 19, 2019, 9:17 a.m.
L4 99 乘法表印出一個九九乘法表吧匿名小飛象章魚March 19, 2019, 9:15 a.m.
L4 fizz buzz匿名小飛象章魚March 19, 2019, 9:13 a.m.
L4 GPA 計算機想快點知道 GPA 是多少呢匿名小飛象章魚March 19, 2019, 9:10 a.m.
L4 1~10000的和Σ(x=1,10000) x匿名小飛象章魚March 19, 2019, 9:09 a.m.
L4 成績等第制將輸入的成績轉換成等第制匿名小飛象章魚March 19, 2019, 12:14 p.m.
L3 閏年判斷是不是閏年匿名小飛象章魚March 19, 2019, 9:07 a.m.
L3 期末考為了拯救期末考,你寫了一支程式匿名小飛象章魚March 19, 2019, 9:07 a.m.
L3 剪刀石頭布和電腦玩剪刀石頭布吧匿名小飛象章魚March 19, 2019, 9:07 a.m.
L3 找大的2輸入三個數字,輸出最大的那個數字匿名小飛象章魚March 19, 2019, 9:07 a.m.
HW1 奇數偶數if else 練習題匿名小飛象章魚March 13, 2019, 7:53 a.m.
\n" 931 | ] 932 | } 933 | ], 934 | "source": [ 935 | "print(bs.table)" 936 | ] 937 | }, 938 | { 939 | "cell_type": "markdown", 940 | "metadata": { 941 | "slideshow": { 942 | "slide_type": "subslide" 943 | } 944 | }, 945 | "source": [ 946 | "### `find()` `find_all()`" 947 | ] 948 | }, 949 | { 950 | "cell_type": "code", 951 | "execution_count": 46, 952 | "metadata": {}, 953 | "outputs": [ 954 | { 955 | "data": { 956 | "text/plain": [ 957 | "\n", 958 | " Coodle\n", 959 | " " 960 | ] 961 | }, 962 | "execution_count": 46, 963 | "metadata": {}, 964 | "output_type": "execute_result" 965 | } 966 | ], 967 | "source": [ 968 | "print(bs.find(\"a\"))" 969 | ] 970 | }, 971 | { 972 | "cell_type": "code", 973 | "execution_count": 47, 974 | "metadata": { 975 | "scrolled": true, 976 | "slideshow": { 977 | "slide_type": "subslide" 978 | } 979 | }, 980 | "outputs": [ 981 | { 982 | "name": "stdout", 983 | "output_type": "stream", 984 | "text": [ 985 | "[\n", 986 | " Coodle\n", 987 | " , \n", 988 | "\n", 989 | "\n", 990 | "\n", 991 | ", \n", 992 | " 練習題\n", 993 | " , \n", 994 | " 討論區\n", 995 | " , \n", 996 | " 登入\n", 997 | " , \n", 998 | "\n", 999 | "\n", 1000 | "\n", 1001 | "\n", 1002 | " 課程資訊\n", 1003 | " \n", 1004 | ", L5 平均, L5 扇形面積, L5 快放暑假了!, L4 有趣的質數, L4 阿姆斯壯數, L4 很多信箱, L4 99 乘法表, L4 fizz buzz, L4 GPA 計算機, L4 1~10000的和, L4 成績等第制, L3 閏年, L3 期末考, L3 剪刀石頭布, L3 找大的2, HW1 奇數偶數]\n" 1005 | ] 1006 | } 1007 | ], 1008 | "source": [ 1009 | "print(bs.find_all(\"a\"))" 1010 | ] 1011 | }, 1012 | { 1013 | "cell_type": "markdown", 1014 | "metadata": { 1015 | "slideshow": { 1016 | "slide_type": "subslide" 1017 | } 1018 | }, 1019 | "source": [ 1020 | "### 取出每個問題的標題" 1021 | ] 1022 | }, 1023 | { 1024 | "cell_type": "code", 1025 | "execution_count": 52, 1026 | "metadata": {}, 1027 | "outputs": [ 1028 | { 1029 | "name": "stdout", 1030 | "output_type": "stream", 1031 | "text": [ 1032 | "[L5 平均, L5 扇形面積, L5 快放暑假了!, L4 有趣的質數, L4 阿姆斯壯數, L4 很多信箱, L4 99 乘法表, L4 fizz buzz, L4 GPA 計算機, L4 1~10000的和, L4 成績等第制, L3 閏年, L3 期末考, L3 剪刀石頭布, L3 找大的2, HW1 奇數偶數]\n" 1033 | ] 1034 | } 1035 | ], 1036 | "source": [ 1037 | "a_tags = bs.table.find_all(\"a\")\n", 1038 | "print(a_tags)" 1039 | ] 1040 | }, 1041 | { 1042 | "cell_type": "code", 1043 | "execution_count": 53, 1044 | "metadata": { 1045 | "slideshow": { 1046 | "slide_type": "subslide" 1047 | } 1048 | }, 1049 | "outputs": [ 1050 | { 1051 | "name": "stdout", 1052 | "output_type": "stream", 1053 | "text": [ 1054 | "L5 平均\n", 1055 | "L5 扇形面積\n", 1056 | "L5 快放暑假了!\n", 1057 | "L4 有趣的質數\n", 1058 | "L4 阿姆斯壯數\n", 1059 | "L4 很多信箱\n", 1060 | "L4 99 乘法表\n", 1061 | "L4 fizz buzz\n", 1062 | "L4 GPA 計算機\n", 1063 | "L4 1~10000的和\n", 1064 | "L4 成績等第制\n", 1065 | "L3 閏年\n", 1066 | "L3 期末考\n", 1067 | "L3 剪刀石頭布\n", 1068 | "L3 找大的2\n", 1069 | "HW1 奇數偶數\n" 1070 | ] 1071 | } 1072 | ], 1073 | "source": [ 1074 | "for a_tag in a_tags:\n", 1075 | " print(a_tag.text)" 1076 | ] 1077 | }, 1078 | { 1079 | "cell_type": "markdown", 1080 | "metadata": { 1081 | "slideshow": { 1082 | "slide_type": "slide" 1083 | } 1084 | }, 1085 | "source": [ 1086 | "## PTT\n", 1087 | "\n", 1088 | "把 soft job 最新的幾個貼文標題抓出來!" 1089 | ] 1090 | }, 1091 | { 1092 | "cell_type": "code", 1093 | "execution_count": 70, 1094 | "metadata": { 1095 | "scrolled": true, 1096 | "slideshow": { 1097 | "slide_type": "subslide" 1098 | } 1099 | }, 1100 | "outputs": [ 1101 | { 1102 | "data": { 1103 | "text/plain": [ 1104 | "[,
\n", 1107 | " \t\t\t\n", 1108 | " \t\t\t\t(本文已被刪除) [sandyangel]\n", 1109 | " \t\t\t\n", 1110 | " \t\t\t
,
\n", 1111 | " [請益] 愛奇藝台北研發中心請教\n", 1112 | "
,
\n", 1113 | " [公告] 本板板規 2017/4/10更新\n", 1114 | "
, , , ,
\n", 1121 | " [板務] 請板友提供板務建議\n", 1122 | "
]" 1123 | ] 1124 | }, 1125 | "execution_count": 70, 1126 | "metadata": {}, 1127 | "output_type": "execute_result" 1128 | } 1129 | ], 1130 | "source": [ 1131 | "import requests\n", 1132 | "from bs4 import BeautifulSoup\n", 1133 | "\n", 1134 | "resp = requests.get(\"https://www.ptt.cc/bbs/Soft_Job/index.html\")\n", 1135 | "bs = BeautifulSoup(resp.text,'html.parser')\n", 1136 | "bs.find_all(\"div\",\"title\")" 1137 | ] 1138 | }, 1139 | { 1140 | "cell_type": "code", 1141 | "execution_count": 71, 1142 | "metadata": { 1143 | "slideshow": { 1144 | "slide_type": "subslide" 1145 | } 1146 | }, 1147 | "outputs": [ 1148 | { 1149 | "name": "stdout", 1150 | "output_type": "stream", 1151 | "text": [ 1152 | "Re: [討論] 認真問~寫程式的時候吃什麼比較ok?\n", 1153 | "(本文已被刪除) [sandyangel]\n", 1154 | "[請益] 愛奇藝台北研發中心請教\n", 1155 | "[公告] 本板板規 2017/4/10更新\n", 1156 | "[公告] 徵才不符板規或徵才自刪公司\n", 1157 | "[情報] 訓練課程與付費APP與網站分享\n", 1158 | "[情報] 社群活動與免費APP與網站分享\n", 1159 | "[板務] 請板友提供板務建議\n", 1160 | "['Re: [討論] 認真問~寫程式的時候吃什麼比較ok?', '(本文已被刪除) [sandyangel]', '[請益] 愛奇藝台北研發中心請教', '[公告] 本板板規 2017/4/10更新', '[公告] 徵才不符板規或徵才自刪公司', '[情報] 訓練課程與付費APP與網站分享', '[情報] 社群活動與免費APP與網站分享', '[板務] 請板友提供板務建議']\n" 1161 | ] 1162 | } 1163 | ], 1164 | "source": [ 1165 | "posts_title = []\n", 1166 | "for title in bs.find_all(\"div\",\"title\"):\n", 1167 | " print(title.text.strip())\n", 1168 | " posts_title.append(title.text.strip())\n", 1169 | "\n", 1170 | "print(posts_title)" 1171 | ] 1172 | }, 1173 | { 1174 | "cell_type": "code", 1175 | "execution_count": 61, 1176 | "metadata": { 1177 | "slideshow": { 1178 | "slide_type": "subslide" 1179 | } 1180 | }, 1181 | "outputs": [ 1182 | { 1183 | "name": "stdout", 1184 | "output_type": "stream", 1185 | "text": [ 1186 | "5\n" 1187 | ] 1188 | } 1189 | ], 1190 | "source": [ 1191 | "# 數一下有幾個請益\n", 1192 | "count = 0\n", 1193 | "for title in posts_title:\n", 1194 | " if \"[請益]\" in title:\n", 1195 | " count += 1\n", 1196 | "print(count)" 1197 | ] 1198 | }, 1199 | { 1200 | "cell_type": "markdown", 1201 | "metadata": { 1202 | "slideshow": { 1203 | "slide_type": "slide" 1204 | } 1205 | }, 1206 | "source": [ 1207 | "## 大的爬蟲\n", 1208 | "\n", 1209 | "![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/WebCrawlerArchitecture.svg/440px-WebCrawlerArchitecture.svg.png)" 1210 | ] 1211 | }, 1212 | { 1213 | "cell_type": "markdown", 1214 | "metadata": { 1215 | "slideshow": { 1216 | "slide_type": "subslide" 1217 | } 1218 | }, 1219 | "source": [ 1220 | "## 案例:\n", 1221 | "\n", 1222 | "每一篇文章的推噓文數" 1223 | ] 1224 | }, 1225 | { 1226 | "cell_type": "code", 1227 | "execution_count": 78, 1228 | "metadata": { 1229 | "slideshow": { 1230 | "slide_type": "subslide" 1231 | } 1232 | }, 1233 | "outputs": [ 1234 | { 1235 | "data": { 1236 | "text/plain": [ 1237 | "\n", 1238 | "\n", 1239 | "\n", 1240 | "\n", 1241 | "\n", 1242 | "\n", 1243 | "看板 Soft_Job 文章列表 - 批踢踢實業坊\n", 1244 | "\n", 1245 | "\n", 1246 | "\n", 1247 | "\n", 1248 | "\n", 1249 | "\n", 1250 | "\n", 1251 | "
\n", 1252 | "
\n", 1253 | "批踢踢實業坊\n", 1254 | "\n", 1255 | "看板 Soft_Job\n", 1256 | "關於我們\n", 1257 | "聯絡資訊\n", 1258 | "
\n", 1259 | "
\n", 1260 | "
\n", 1261 | "
\n", 1262 | "
\n", 1263 | "
\n", 1264 | "看板\n", 1265 | "精華區\n", 1266 | "
\n", 1267 | "
\n", 1268 | "最舊\n", 1269 | "‹ 上頁\n", 1270 | "下頁 ›\n", 1271 | "最新\n", 1272 | "
\n", 1273 | "
\n", 1274 | "
\n", 1275 | "
\n", 1276 | "
\n", 1277 | "
\n", 1278 | "\n", 1279 | "
\n", 1280 | "
\n", 1281 | "
\n", 1282 | "
10
\n", 1283 | "
\n", 1284 | "Re: [心得] 非本科轉職經驗談\n", 1285 | "
\n", 1286 | "
\n", 1287 | "
ripple0129
\n", 1288 | "
\n", 1289 | "
\n", 1290 | "
\n", 1291 | "\n", 1292 | "\n", 1293 | "
\n", 1294 | "
\n", 1295 | "
4/06
\n", 1296 | "
\n", 1297 | "
\n", 1298 | "
\n", 1299 | "
\n", 1300 | "
6
\n", 1301 | "
\n", 1302 | "[請益] 九章算法\n", 1303 | "
\n", 1304 | "
\n", 1305 | "
a29831968
\n", 1306 | "
\n", 1307 | "
\n", 1308 | "
\n", 1309 | "\n", 1310 | "\n", 1311 | "
\n", 1312 | "
\n", 1313 | "
4/06
\n", 1314 | "
\n", 1315 | "
\n", 1316 | "
\n", 1317 | "
\n", 1318 | "
19
\n", 1319 | "
\n", 1320 | "[分享] 龜找殼 LINE買房機器人\n", 1321 | "
\n", 1322 | "
\n", 1323 | "
c1823akimo
\n", 1324 | "
\n", 1325 | "
\n", 1326 | "
\n", 1327 | "\n", 1328 | "\n", 1329 | "
\n", 1330 | "
\n", 1331 | "
4/06
\n", 1332 | "
\n", 1333 | "
\n", 1334 | "
\n", 1335 | "
\n", 1336 | "
8
\n", 1337 | "
\n", 1338 | "Re: [心得] 非本科轉職經驗談\n", 1339 | "
\n", 1340 | "
\n", 1341 | "
j0958322080
\n", 1342 | "
\n", 1343 | "
\n", 1344 | "
\n", 1345 | "\n", 1346 | "\n", 1347 | "
\n", 1348 | "
\n", 1349 | "
4/06
\n", 1350 | "
\n", 1351 | "
\n", 1352 | "
\n", 1353 | "
\n", 1354 | "
33
\n", 1355 | "\n", 1358 | "
\n", 1359 | "
a22115555
\n", 1360 | "
\n", 1361 | "
\n", 1362 | "
\n", 1363 | "\n", 1364 | "\n", 1365 | "
\n", 1366 | "
\n", 1367 | "
4/07
\n", 1368 | "
\n", 1369 | "
\n", 1370 | "
\n", 1371 | "
\n", 1372 | "
43
\n", 1373 | "\n", 1376 | "
\n", 1377 | "
wendly777
\n", 1378 | "
\n", 1379 | "
\n", 1380 | "
\n", 1381 | "\n", 1382 | "\n", 1383 | "
\n", 1384 | "
\n", 1385 | "
4/07
\n", 1386 | "
\n", 1387 | "
\n", 1388 | "
\n", 1389 | "
\n", 1390 | "
10
\n", 1391 | "\n", 1394 | "
\n", 1395 | "
klolong
\n", 1396 | "
\n", 1397 | "
\n", 1398 | "
\n", 1399 | "\n", 1400 | "\n", 1401 | "
\n", 1402 | "
\n", 1403 | "
4/07
\n", 1404 | "
\n", 1405 | "
\n", 1406 | "
\n", 1407 | "
\n", 1408 | "
9
\n", 1409 | "
\n", 1410 | "[請益] 轉職ML請教\n", 1411 | "
\n", 1412 | "
\n", 1413 | "
com183
\n", 1414 | "
\n", 1415 | "
\n", 1416 | "
\n", 1417 | "\n", 1418 | "\n", 1419 | "
\n", 1420 | "
\n", 1421 | "
4/07
\n", 1422 | "
\n", 1423 | "
\n", 1424 | "
\n", 1425 | "
\n", 1426 | "
3
\n", 1427 | "\n", 1430 | "
\n", 1431 | "
jyuan1993
\n", 1432 | "
\n", 1433 | "
\n", 1434 | "
\n", 1435 | "\n", 1436 | "\n", 1437 | "
\n", 1438 | "
\n", 1439 | "
4/07
\n", 1440 | "
\n", 1441 | "
\n", 1442 | "
\n", 1443 | "
\n", 1444 | "
9
\n", 1445 | "
\n", 1446 | "[請益] 轉職offer請益\n", 1447 | "
\n", 1448 | "
\n", 1449 | "
mcsausage
\n", 1450 | "
\n", 1451 | "
\n", 1452 | "
\n", 1453 | "\n", 1454 | "\n", 1455 | "
\n", 1456 | "
\n", 1457 | "
4/07
\n", 1458 | "
\n", 1459 | "
\n", 1460 | "
\n", 1461 | "
\n", 1462 | "
31
\n", 1463 | "\n", 1466 | "
\n", 1467 | "
taiwan08
\n", 1468 | "
\n", 1469 | "
\n", 1470 | "
\n", 1471 | "\n", 1472 | "\n", 1473 | "
\n", 1474 | "
\n", 1475 | "
4/08
\n", 1476 | "
\n", 1477 | "
\n", 1478 | "
\n", 1479 | "
\n", 1480 | "
10
\n", 1481 | "\n", 1484 | "
\n", 1485 | "
travious
\n", 1486 | "
\n", 1487 | "
\n", 1488 | "
\n", 1489 | "\n", 1490 | "\n", 1491 | "
\n", 1492 | "
\n", 1493 | "
4/08
\n", 1494 | "
\n", 1495 | "
\n", 1496 | "
\n", 1497 | "
\n", 1498 | "
8
\n", 1499 | "
\n", 1500 | "[討論] Wix and WordPress\n", 1501 | "
\n", 1502 | "
\n", 1503 | "
sweetsss111
\n", 1504 | "
\n", 1505 | "
\n", 1506 | "
\n", 1507 | "\n", 1508 | "\n", 1509 | "
\n", 1510 | "
\n", 1511 | "
4/08
\n", 1512 | "
\n", 1513 | "
\n", 1514 | "
\n", 1515 | "
\n", 1516 | "
14
\n", 1517 | "\n", 1520 | "
\n", 1521 | "
hanyi0923
\n", 1522 | "
\n", 1523 | "
\n", 1524 | "
\n", 1525 | "\n", 1526 | "\n", 1527 | "
\n", 1528 | "
\n", 1529 | "
4/08
\n", 1530 | "
\n", 1531 | "
\n", 1532 | "
\n", 1533 | "
\n", 1534 | "
5
\n", 1535 | "
\n", 1536 | "[請益] 新鮮人離職請益\n", 1537 | "
\n", 1538 | "
\n", 1539 | "
nlpsl202
\n", 1540 | "
\n", 1541 | "
\n", 1542 | "
\n", 1543 | "\n", 1544 | "\n", 1545 | "
\n", 1546 | "
\n", 1547 | "
4/09
\n", 1548 | "
\n", 1549 | "
\n", 1550 | "
\n", 1551 | "
\n", 1552 | "
9
\n", 1553 | "
\n", 1554 | "[請益] 菜鳥OFFER請益\n", 1555 | "
\n", 1556 | "
\n", 1557 | "
aegisty
\n", 1558 | "
\n", 1559 | "
\n", 1560 | "
\n", 1561 | "\n", 1562 | "\n", 1563 | "
\n", 1564 | "
\n", 1565 | "
4/09
\n", 1566 | "
\n", 1567 | "
\n", 1568 | "
\n", 1569 | "
\n", 1570 | "
23
\n", 1571 | "
\n", 1572 | "[請益] 寫軟體難被家人認同?\n", 1573 | "
\n", 1574 | "
\n", 1575 | "
MrSundayy
\n", 1576 | "
\n", 1577 | "
\n", 1578 | "
\n", 1579 | "\n", 1580 | "\n", 1581 | "
\n", 1582 | "
\n", 1583 | "
4/09
\n", 1584 | "
\n", 1585 | "
\n", 1586 | "
\n", 1587 | "
\n", 1588 | "
4
\n", 1589 | "\n", 1592 | "
\n", 1593 | "
poopoo888888
\n", 1594 | "
\n", 1595 | "
\n", 1596 | "\n", 1600 | "
\n", 1601 | "
4/09
\n", 1602 | "
\n", 1603 | "
\n", 1604 | "
\n", 1605 | "
\n", 1606 | "
1
\n", 1607 | "
\n", 1608 | "\t\t\t\n", 1609 | "\t\t\t\t(本文已被刪除) [NadiaArwall]\n", 1610 | "\t\t\t\n", 1611 | "\t\t\t
\n", 1612 | "
\n", 1613 | "
-
\n", 1614 | "
\n", 1615 | "
\n", 1616 | "
4/09
\n", 1617 | "
\n", 1618 | "
\n", 1619 | "
\n", 1620 | "
\n", 1621 | "
7
\n", 1622 | "\n", 1625 | "
\n", 1626 | "
dharma
\n", 1627 | "
\n", 1628 | "
\n", 1629 | "
\n", 1630 | "\n", 1631 | "\n", 1632 | "
\n", 1633 | "
\n", 1634 | "
4/09
\n", 1635 | "
\n", 1636 | "
\n", 1637 | "
\n", 1638 | "
\n", 1639 | "
\n", 1640 | "\n", 1652 | "\n", 1653 | "\n", 1654 | "\n", 1655 | "" 1656 | ] 1657 | }, 1658 | "execution_count": 78, 1659 | "metadata": {}, 1660 | "output_type": "execute_result" 1661 | } 1662 | ], 1663 | "source": [ 1664 | "import requests\n", 1665 | "from bs4 import BeautifulSoup\n", 1666 | "\n", 1667 | "resp = requests.get(\"https://www.ptt.cc/bbs/Soft_Job/index1464.html\")\n", 1668 | "bs = BeautifulSoup(resp.text, 'html.parser')\n", 1669 | "bs" 1670 | ] 1671 | }, 1672 | { 1673 | "cell_type": "code", 1674 | "execution_count": 79, 1675 | "metadata": { 1676 | "scrolled": true, 1677 | "slideshow": { 1678 | "slide_type": "subslide" 1679 | } 1680 | }, 1681 | "outputs": [ 1682 | { 1683 | "data": { 1684 | "text/plain": [ 1685 | "[批踢踢實業坊,\n", 1686 | " 看板 Soft_Job,\n", 1687 | " 關於我們,\n", 1688 | " 聯絡資訊,\n", 1689 | " 看板,\n", 1690 | " 精華區,\n", 1691 | " 最舊,\n", 1692 | " ‹ 上頁,\n", 1693 | " 下頁 ›,\n", 1694 | " 最新,\n", 1695 | " Re: [心得] 非本科轉職經驗談,\n", 1696 | " 搜尋同標題文章,\n", 1697 | " 搜尋看板內 ripple0129 的文章,\n", 1698 | " [請益] 九章算法,\n", 1699 | " 搜尋同標題文章,\n", 1700 | " 搜尋看板內 a29831968 的文章,\n", 1701 | " [分享] 龜找殼 LINE買房機器人,\n", 1702 | " 搜尋同標題文章,\n", 1703 | " 搜尋看板內 c1823akimo 的文章,\n", 1704 | " Re: [心得] 非本科轉職經驗談,\n", 1705 | " 搜尋同標題文章,\n", 1706 | " 搜尋看板內 j0958322080 的文章,\n", 1707 | " [請益] 想往這行走 大學該讀哪?,\n", 1708 | " 搜尋同標題文章,\n", 1709 | " 搜尋看板內 a22115555 的文章,\n", 1710 | " Re: [徵才] Flo 誠徵 Embedded Software Engineer,\n", 1711 | " 搜尋同標題文章,\n", 1712 | " 搜尋看板內 wendly777 的文章,\n", 1713 | " [請益] 設備轉職Java Web 行情請益,\n", 1714 | " 搜尋同標題文章,\n", 1715 | " 搜尋看板內 klolong 的文章,\n", 1716 | " [請益] 轉職ML請教,\n", 1717 | " 搜尋同標題文章,\n", 1718 | " 搜尋看板內 com183 的文章,\n", 1719 | " [討論] 團報:第二屆《機器學習百日馬拉松》,\n", 1720 | " 搜尋同標題文章,\n", 1721 | " 搜尋看板內 jyuan1993 的文章,\n", 1722 | " [請益] 轉職offer請益,\n", 1723 | " 搜尋同標題文章,\n", 1724 | " 搜尋看板內 mcsausage 的文章,\n", 1725 | " [新聞] 街口收購愛評網後轉移現金資產並解雇員工,\n", 1726 | " 搜尋同標題文章,\n", 1727 | " 搜尋看板內 taiwan08 的文章,\n", 1728 | " [徵才] LyncusTek誠徵Junior Frontend Engineer,\n", 1729 | " 搜尋同標題文章,\n", 1730 | " 搜尋看板內 travious 的文章,\n", 1731 | " [討論] Wix and WordPress,\n", 1732 | " 搜尋同標題文章,\n", 1733 | " 搜尋看板內 sweetsss111 的文章,\n", 1734 | " Fw: [請益] 實習offer請益(微軟/Google),\n", 1735 | " 搜尋同標題文章,\n", 1736 | " 搜尋看板內 hanyi0923 的文章,\n", 1737 | " [請益] 新鮮人離職請益,\n", 1738 | " 搜尋同標題文章,\n", 1739 | " 搜尋看板內 nlpsl202 的文章,\n", 1740 | " [請益] 菜鳥OFFER請益,\n", 1741 | " 搜尋同標題文章,\n", 1742 | " 搜尋看板內 aegisty 的文章,\n", 1743 | " [請益] 寫軟體難被家人認同?,\n", 1744 | " 搜尋同標題文章,\n", 1745 | " 搜尋看板內 MrSundayy 的文章,\n", 1746 | " [分享] 跟網友一起蒐集資料的 open source 系統,\n", 1747 | " 搜尋同標題文章,\n", 1748 | " 搜尋看板內 poopoo888888 的文章,\n", 1749 | " [請益] Google內部技術工作的鄙視鏈?,\n", 1750 | " 搜尋同標題文章,\n", 1751 | " 搜尋看板內 dharma 的文章]" 1752 | ] 1753 | }, 1754 | "execution_count": 79, 1755 | "metadata": {}, 1756 | "output_type": "execute_result" 1757 | } 1758 | ], 1759 | "source": [ 1760 | "bs.find_all(\"a\")" 1761 | ] 1762 | }, 1763 | { 1764 | "cell_type": "code", 1765 | "execution_count": 89, 1766 | "metadata": { 1767 | "slideshow": { 1768 | "slide_type": "subslide" 1769 | } 1770 | }, 1771 | "outputs": [ 1772 | { 1773 | "name": "stdout", 1774 | "output_type": "stream", 1775 | "text": [ 1776 | "Re: [心得] 非本科轉職經驗談\n", 1777 | "/bbs/Soft_Job/M.1554497629.A.BC9.html\n", 1778 | "推噓箭頭: 51\n", 1779 | "\n", 1780 | "[請益] 九章算法\n", 1781 | "/bbs/Soft_Job/M.1554515452.A.E69.html\n", 1782 | "推噓箭頭: 17\n", 1783 | "\n", 1784 | "[分享] 龜找殼 LINE買房機器人\n", 1785 | "/bbs/Soft_Job/M.1554522627.A.C93.html\n", 1786 | "推噓箭頭: 22\n", 1787 | "\n", 1788 | "Re: [心得] 非本科轉職經驗談\n", 1789 | "/bbs/Soft_Job/M.1554547280.A.486.html\n", 1790 | "推噓箭頭: 20\n", 1791 | "\n", 1792 | "[請益] 想往這行走 大學該讀哪?\n", 1793 | "/bbs/Soft_Job/M.1554568574.A.7AB.html\n", 1794 | "推噓箭頭: 104\n", 1795 | "\n", 1796 | "Re: [徵才] Flo 誠徵 Embedded Software Engineer\n", 1797 | "/bbs/Soft_Job/M.1554573254.A.5A8.html\n", 1798 | "推噓箭頭: 77\n", 1799 | "\n", 1800 | "[請益] 設備轉職Java Web 行情請益\n", 1801 | "/bbs/Soft_Job/M.1554613251.A.89E.html\n", 1802 | "推噓箭頭: 49\n", 1803 | "\n", 1804 | "[請益] 轉職ML請教\n", 1805 | "/bbs/Soft_Job/M.1554628577.A.ADC.html\n", 1806 | "推噓箭頭: 43\n", 1807 | "\n", 1808 | "[討論] 團報:第二屆《機器學習百日馬拉松》\n", 1809 | "/bbs/Soft_Job/M.1554634119.A.B54.html\n", 1810 | "推噓箭頭: 6\n", 1811 | "\n", 1812 | "[請益] 轉職offer請益\n", 1813 | "/bbs/Soft_Job/M.1554647372.A.ADC.html\n", 1814 | "推噓箭頭: 23\n", 1815 | "\n", 1816 | "[新聞] 街口收購愛評網後轉移現金資產並解雇員工\n", 1817 | "/bbs/Soft_Job/M.1554717492.A.3FD.html\n", 1818 | "推噓箭頭: 59\n", 1819 | "\n", 1820 | "[徵才] LyncusTek誠徵Junior Frontend Engineer\n", 1821 | "/bbs/Soft_Job/M.1554720729.A.493.html\n", 1822 | "推噓箭頭: 13\n", 1823 | "\n", 1824 | "[討論] Wix and WordPress\n", 1825 | "/bbs/Soft_Job/M.1554727074.A.422.html\n", 1826 | "推噓箭頭: 16\n", 1827 | "\n", 1828 | "Fw: [請益] 實習offer請益(微軟/Google)\n", 1829 | "/bbs/Soft_Job/M.1554733003.A.586.html\n", 1830 | "推噓箭頭: 38\n", 1831 | "\n", 1832 | "[請益] 新鮮人離職請益\n", 1833 | "/bbs/Soft_Job/M.1554747646.A.C71.html\n", 1834 | "推噓箭頭: 20\n", 1835 | "\n", 1836 | "[請益] 菜鳥OFFER請益\n", 1837 | "/bbs/Soft_Job/M.1554748125.A.4DA.html\n", 1838 | "推噓箭頭: 14\n", 1839 | "\n", 1840 | "[請益] 寫軟體難被家人認同?\n", 1841 | "/bbs/Soft_Job/M.1554768580.A.6FA.html\n", 1842 | "推噓箭頭: 96\n", 1843 | "\n", 1844 | "[分享] 跟網友一起蒐集資料的 open source 系統\n", 1845 | "/bbs/Soft_Job/M.1554777176.A.62E.html\n", 1846 | "推噓箭頭: 4\n", 1847 | "\n", 1848 | "[請益] Google內部技術工作的鄙視鏈?\n", 1849 | "/bbs/Soft_Job/M.1554779333.A.5DC.html\n", 1850 | "推噓箭頭: 19\n", 1851 | "\n" 1852 | ] 1853 | } 1854 | ], 1855 | "source": [ 1856 | "# 所有的標題超連結\n", 1857 | "posts_title = bs.find_all(\"div\",\"title\")\n", 1858 | "for post in posts_title:\n", 1859 | "\n", 1860 | " # 有些文章被刪除了,只拜訪沒有被刪除的\n", 1861 | " if post.a: \n", 1862 | " print(post.text.strip())\n", 1863 | " \n", 1864 | " # 文章標題\n", 1865 | " post_url = post.a['href'].strip()\n", 1866 | " print(post_url)\n", 1867 | " \n", 1868 | " # 拜訪該文章頁面\n", 1869 | " post_resp = requests.get(\"https://www.ptt.cc/\" + post_url)\n", 1870 | " post_bs = BeautifulSoup(post_resp.text, 'html.parser')\n", 1871 | " \n", 1872 | " # 抓出推噓箭頭\n", 1873 | " push = post_bs.find_all(\"div\",\"push\")\n", 1874 | " print(\"推噓箭頭:\", len(push))\n", 1875 | " print()\n", 1876 | " \n", 1877 | " " 1878 | ] 1879 | }, 1880 | { 1881 | "cell_type": "code", 1882 | "execution_count": null, 1883 | "metadata": {}, 1884 | "outputs": [], 1885 | "source": [] 1886 | }, 1887 | { 1888 | "cell_type": "code", 1889 | "execution_count": null, 1890 | "metadata": {}, 1891 | "outputs": [], 1892 | "source": [] 1893 | }, 1894 | { 1895 | "cell_type": "code", 1896 | "execution_count": null, 1897 | "metadata": {}, 1898 | "outputs": [], 1899 | "source": [] 1900 | } 1901 | ], 1902 | "metadata": { 1903 | "celltoolbar": "Slideshow", 1904 | "kernelspec": { 1905 | "display_name": "Python 3", 1906 | "language": "python", 1907 | "name": "python3" 1908 | }, 1909 | "language_info": { 1910 | "codemirror_mode": { 1911 | "name": "ipython", 1912 | "version": 3 1913 | }, 1914 | "file_extension": ".py", 1915 | "mimetype": "text/x-python", 1916 | "name": "python", 1917 | "nbconvert_exporter": "python", 1918 | "pygments_lexer": "ipython3", 1919 | "version": "3.6.5" 1920 | } 1921 | }, 1922 | "nbformat": 4, 1923 | "nbformat_minor": 2 1924 | } 1925 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Python 入門 2 | 3 | `臺科程式設計研究社` `hanklu.tw` 4 | 5 | ![](https://img.shields.io/badge/python-3-blue.svg) 6 | 7 | > 每週二 18:30~21:00,教室會每週在粉絲專頁公佈 8 | > 9 | > [討論群組](https://m.me/join/AbaVN1BjdDB1FnY2) 10 | 11 | ## Lectures 12 | 13 | > note: 教材的標題是依據每週的上課目標,內容可能會搭配補充觀念在各簡報中 14 | 15 | ### Introduction 16 | 17 | - [slide](https://hanklu.tw/python/slides/lecture1.pdf) 18 | - [Install Python&Jupyter](https://hackmd.io/s/S1fraKMRm) 19 | 20 | ### Python basic 21 | 22 | - 2-Variable and types 23 | - [slide](https://hanklu.tw/python/slides/lecture2.slides.html) 24 | - [notebook](http://hanklu.tw/python/notebooks/leture2.ipynb) 25 | - 3-Condition 26 | - [slide](https://hanklu.tw/python/slides/lecture3.slides.html) 27 | - [notebook](http://hanklu.tw/python/notebooks/leture3.ipynb) 28 | - 4-Loop 29 | - [slide](https://hanklu.tw/python/slides/lecture4.slides.html) 30 | - [notebook](http://hanklu.tw/python/notebooks/leture4.ipynb) 31 | - 5-Function and Library 32 | - [slide](https://hanklu.tw/python/slides/lecture5.slides.html) 33 | - [notebook](http://hanklu.tw/python/notebooks/lecture5.html) 34 | 35 | ### 網路爬蟲 36 | 37 | - 6-基礎知識 38 | 39 | - [slide](https://hanklu.tw/python/slides/lecture6.slides.html) 40 | - [notebook](http://hanklu.tw/python/notebooks/leture6.ipynb) 41 | 42 | - 7-進階知識&實作 43 | - [slide](https://hanklu.tw/python/slides/lecture7.slides.html) 44 | - [notebook](http://hanklu.tw/python/notebooks/leture7.ipynb) 45 | 46 | ### 資料視覺化 47 | 48 | - 8-Pandas 49 | - [slide](https://hanklu.tw/python/slides/lecture8.slides.html) 50 | - [notebook](http://hanklu.tw/python/notebooks/leture8.ipynb) 51 | 52 | ### 網路應用(Django) 53 | 54 | - 9-Introduction & Template engine 55 | 56 | - [slide](https://docs.google.com/presentation/d/1VUzg5uuPAwcfK-s1RFF0nByRJHBvEDffpzS-MC8ictk) 57 | 58 | - 10-Model 59 | 60 | - [slide](https://docs.google.com/presentation/d/1Pjv_96V2HJaX6CQdqXGbukiTX9ufAxyT5VdIIM7hbfE) 61 | 62 | - 11-Chatbot 串接 63 | - [slide](https://docs.google.com/presentation/d/1iNuMxyC-rwFBfEB67RbHzb1oym30vJ84dFpxuAJWhNg) 64 | 65 | ## Related resources 66 | 67 | - [python for everybody](https://py4e.org) 68 | - [coursera](https://zh-tw.coursera.org/learn/python) 69 | - [practicing python3](https://speakerdeck.com/mosky/practicing-python-3) 70 | 71 | - [HuskyHsu - Introducing-Python](https://github.com/HuskyHsu/Introducing-Python) 72 | 73 | - [https://github.com/TheAlgorithms/Python](https://github.com/TheAlgorithms/Python) 74 | 75 | ## Other 76 | 77 | [reveal.js](https://github.com/hakimel/reveal.js) 78 | -------------------------------------------------------------------------------- /slides.sh: -------------------------------------------------------------------------------- 1 | jupyter nbconvert ./notebooks/lecture*.ipynb --to slides --reveal-prefix "https://cdn.jsdelivr.net/npm/reveal.js@3.6.0" --output-dir ./slides/ 2 | git add . 3 | git commit -m "`date`" 4 | -------------------------------------------------------------------------------- /slides/lecture1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kehanlu/python/288abf7443c0fcd988d231fd992a8b4e230709c7/slides/lecture1.pdf --------------------------------------------------------------------------------