实例介绍
【实例简介】
【实例截图】
【核心代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 | Table of Contents Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii Part I. Getting Started 1. A Python Q&A Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Why Do People Use Python? 3 Software Quality 4 Developer Productivity 5 Is Python a “Scripting Language”? 5 OK, but What’s the Downside? 7 Who Uses Python Today? 9 What Can I Do with Python? 10 Systems Programming 11 GUIs 11 Internet Scripting 11 Component Integration 12 Database Programming 12 Rapid Prototyping 13 Numeric and Scientific Programming 13 And More: Gaming, Images, Data Mining, Robots, Excel... 14 How Is Python Developed and Supported? 15 Open Source Tradeoffs 15 What Are Python’s Technical Strengths? 16 It’s Object-Oriented and Functional 16 It’s Free 17 It’s Portable 17 It’s Powerful 18 It’s Mixable 19 It’s Relatively Easy to Use 19 It’s Relatively Easy to Learn 20 It’s Named After Monty Python 20 v How Does Python Stack Up to Language X? 21 Chapter Summary 22 Test Your Knowledge: Quiz 23 Test Your Knowledge: Answers 23 2. How Python Runs Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Introducing the Python Interpreter 27 Program Execution 28 The Programmer’s View 28 Python’s View 30 Execution Model Variations 33 Python Implementation Alternatives 33 Execution Optimization Tools 37 Frozen Binaries 39 Future Possibilities? 40 Chapter Summary 40 Test Your Knowledge: Quiz 41 Test Your Knowledge: Answers 41 3. How You Run Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 The Interactive Prompt 43 Starting an Interactive Session 44 The System Path 45 New Windows Options in 3.3: PATH, Launcher 46 Where to Run: Code Directories 47 What Not to Type: Prompts and Comments 48 Running Code Interactively 49 Why the Interactive Prompt? 50 Usage Notes: The Interactive Prompt 52 System Command Lines and Files 54 A First Script 55 Running Files with Command Lines 56 Command-Line Usage Variations 57 Usage Notes: Command Lines and Files 58 Unix-Style Executable Scripts: #! 59 Unix Script Basics 59 The Unix env Lookup Trick 60 The Python 3.3 Windows Launcher: #! Comes to Windows 60 Clicking File Icons 62 Icon-Click Basics 62 Clicking Icons on Windows 63 The input Trick on Windows 63 Other Icon-Click Limitations 66 vi | Table of Contents Module Imports and Reloads 66 Import and Reload Basics 66 The Grander Module Story: Attributes 68 Usage Notes: import and reload 71 Using exec to Run Module Files 72 The IDLE User Interface 73 IDLE Startup Details 74 IDLE Basic Usage 75 IDLE Usability Features 76 Advanced IDLE Tools 77 Usage Notes: IDLE 78 Other IDEs 79 Other Launch Options 81 Embedding Calls 81 Frozen Binary Executables 82 Text Editor Launch Options 82 Still Other Launch Options 82 Future Possibilities? 83 Which Option Should I Use? 83 Chapter Summary 85 Test Your Knowledge: Quiz 85 Test Your Knowledge: Answers 86 Test Your Knowledge: Part I Exercises 87 Part II. Types and Operations 4. Introducing Python Object Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 The Python Conceptual Hierarchy 93 Why Use Built-in Types? 94 Python’s Core Data Types 95 Numbers 97 Strings 99 Sequence Operations 99 Immutability 101 Type-Specific Methods 102 Getting Help 104 Other Ways to Code Strings 105 Unicode Strings 106 Pattern Matching 108 Lists 109 Sequence Operations 109 Type-Specific Operations 109 Table of Contents | vii Bounds Checking 110 Nesting 110 Comprehensions 111 Dictionaries 113 Mapping Operations 114 Nesting Revisited 115 Missing Keys: if Tests 116 Sorting Keys: for Loops 118 Iteration and Optimization 120 Tuples 121 Why Tuples? 122 Files 122 Binary Bytes Files 123 Unicode Text Files 124 Other File-Like Tools 126 Other Core Types 126 How to Break Your Code’s Flexibility 128 User-Defined Classes 129 And Everything Else 130 Chapter Summary 130 Test Your Knowledge: Quiz 131 Test Your Knowledge: Answers 131 5. Numeric Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Numeric Type Basics 133 Numeric Literals 134 Built-in Numeric Tools 136 Python Expression Operators 136 Numbers in Action 141 Variables and Basic Expressions 141 Numeric Display Formats 143 Comparisons: Normal and Chained 144 Division: Classic, Floor, and True 146 Integer Precision 150 Complex Numbers 151 Hex, Octal, Binary: Literals and Conversions 151 Bitwise Operations 153 Other Built-in Numeric Tools 155 Other Numeric Types 157 Decimal Type 157 Fraction Type 160 Sets 163 Booleans 171 viii | Table of Contents Numeric Extensions 172 Chapter Summary 172 Test Your Knowledge: Quiz 173 Test Your Knowledge: Answers 173 6. The Dynamic Typing Interlude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 The Case of the Missing Declaration Statements 175 Variables, Objects, and References 176 Types Live with Objects, Not Variables 177 Objects Are Garbage-Collected 178 Shared References 180 Shared References and In-Place Changes 181 Shared References and Equality 183 Dynamic Typing Is Everywhere 185 Chapter Summary 186 Test Your Knowledge: Quiz 186 Test Your Knowledge: Answers 186 7. String Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 This Chapter’s Scope 189 Unicode: The Short Story 189 String Basics 190 String Literals 192 Single- and Double-Quoted Strings Are the Same 193 Escape Sequences Represent Special Characters 193 Raw Strings Suppress Escapes 196 Triple Quotes Code Multiline Block Strings 198 Strings in Action 200 Basic Operations 200 Indexing and Slicing 201 String Conversion Tools 205 Changing Strings I 208 String Methods 209 Method Call Syntax 209 Methods of Strings 210 String Method Examples: Changing Strings II 211 String Method Examples: Parsing Text 213 Other Common String Methods in Action 214 The Original string Module’s Functions (Gone in 3.X) 215 String Formatting Expressions 216 Formatting Expression Basics 217 Advanced Formatting Expression Syntax 218 Advanced Formatting Expression Examples 220 Table of Contents | ix Dictionary-Based Formatting Expressions 221 String Formatting Method Calls 222 Formatting Method Basics 222 Adding Keys, Attributes, and Offsets 223 Advanced Formatting Method Syntax 224 Advanced Formatting Method Examples 225 Comparison to the % Formatting Expression 227 Why the Format Method? 230 General Type Categories 235 Types Share Operation Sets by Categories 235 Mutable Types Can Be Changed in Place 236 Chapter Summary 237 Test Your Knowledge: Quiz 237 Test Your Knowledge: Answers 237 8. Lists and Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Lists 239 Lists in Action 242 Basic List Operations 242 List Iteration and Comprehensions 242 Indexing, Slicing, and Matrixes 243 Changing Lists in Place 244 Dictionaries 250 Dictionaries in Action 252 Basic Dictionary Operations 253 Changing Dictionaries in Place 254 More Dictionary Methods 254 Example: Movie Database 256 Dictionary Usage Notes 258 Other Ways to Make Dictionaries 262 Dictionary Changes in Python 3.X and 2.7 264 Chapter Summary 271 Test Your Knowledge: Quiz 272 Test Your Knowledge: Answers 272 9. Tuples, Files, and Everything Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Tuples 276 Tuples in Action 277 Why Lists and Tuples? 279 Records Revisited: Named Tuples 280 Files 282 Opening Files 283 Using Files 284 x | Table of Contents Files in Action 285 Text and Binary Files: The Short Story 287 Storing Python Objects in Files: Conversions 288 Storing Native Python Objects: pickle 290 Storing Python Objects in JSON Format 291 Storing Packed Binary Data: struct 293 File Context Managers 294 Other File Tools 294 Core Types Review and Summary 295 Object Flexibility 297 References Versus Copies 297 Comparisons, Equality, and Truth 300 The Meaning of True and False in Python 304 Python’s Type Hierarchies 306 Type Objects 306 Other Types in Python 308 Built-in Type Gotchas 308 Assignment Creates References, Not Copies 308 Repetition Adds One Level Deep 309 Beware of Cyclic Data Structures 310 Immutable Types Can’t Be Changed in Place 311 Chapter Summary 311 Test Your Knowledge: Quiz 311 Test Your Knowledge: Answers 312 Test Your Knowledge: Part II Exercises 313 Part III. Statements and Syntax 10. Introducing Python Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 The Python Conceptual Hierarchy Revisited 319 Python’s Statements 320 A Tale of Two ifs 322 What Python Adds 322 What Python Removes 323 Why Indentation Syntax? 324 A Few Special Cases 327 A Quick Example: Interactive Loops 329 A Simple Interactive Loop 329 Doing Math on User Inputs 331 Handling Errors by Testing Inputs 332 Handling Errors with try Statements 333 Nesting Code Three Levels Deep 335 Table of Contents | xi Chapter Summary 336 Test Your Knowledge: Quiz 336 Test Your Knowledge: Answers 336 11. Assignments, Expressions, and Prints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Assignment Statements 339 Assignment Statement Forms 340 Sequence Assignments 341 Extended Sequence Unpacking in Python 3.X 344 Multiple-Target Assignments 348 Augmented Assignments 350 Variable Name Rules 352 Expression Statements 356 Expression Statements and In-Place Changes 357 Print Operations 358 The Python 3.X print Function 359 The Python 2.X print Statement 361 Print Stream Redirection 363 Version-Neutral Printing 366 Chapter Summary 369 Test Your Knowledge: Quiz 370 Test Your Knowledge: Answers 370 12. if Tests and Syntax Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 if Statements 371 General Format 371 Basic Examples 372 Multiway Branching 372 Python Syntax Revisited 375 Block Delimiters: Indentation Rules 376 Statement Delimiters: Lines and Continuations 378 A Few Special Cases 379 Truth Values and Boolean Tests 380 The if/else Ternary Expression 382 Chapter Summary 385 Test Your Knowledge: Quiz 385 Test Your Knowledge: Answers 386 13. while and for Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 while Loops 387 General Format 388 Examples 388 break, continue, pass, and the Loop else 389 xii | Table of Contents General Loop Format 389 pass 390 continue 391 break 391 Loop else 392 for Loops 395 General Format 395 Examples 395 Loop Coding Techniques 402 Counter Loops: range 402 Sequence Scans: while and range Versus for 403 Sequence Shufflers: range and len 404 Nonexhaustive Traversals: range Versus Slices 405 Changing Lists: range Versus Comprehensions 406 Parallel Traversals: zip and map 407 Generating Both Offsets and Items: enumerate 410 Chapter Summary 413 Test Your Knowledge: Quiz 414 Test Your Knowledge: Answers 414 14. Iterations and Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Iterations: A First Look 416 The Iteration Protocol: File Iterators 416 Manual Iteration: iter and next 419 Other Built-in Type Iterables 422 List Comprehensions: A First Detailed Look 424 List Comprehension Basics 425 Using List Comprehensions on Files 426 Extended List Comprehension Syntax 427 Other Iteration Contexts 429 New Iterables in Python 3.X 434 Impacts on 2.X Code: Pros and Cons 434 The range Iterable 435 The map, zip, and filter Iterables 436 Multiple Versus Single Pass Iterators 438 Dictionary View Iterables 439 Other Iteration Topics 440 Chapter Summary 441 Test Your Knowledge: Quiz 441 Test Your Knowledge: Answers 441 15. The Documentation Interlude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 Python Documentation Sources 443 Table of Contents | xiii # Comments 444 The dir Function 444 Docstrings: __doc__ 446 PyDoc: The help Function 449 PyDoc: HTML Reports 452 Beyond docstrings: Sphinx 461 The Standard Manual Set 461 Web Resources 462 Published Books 463 Common Coding Gotchas 463 Chapter Summary 465 Test Your Knowledge: Quiz 466 Test Your Knowledge: Answers 466 Test Your Knowledge: Part III Exercises 467 Part IV. Functions and Generators 16. Function Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 Why Use Functions? 474 Coding Functions 475 def Statements 476 def Executes at Runtime 477 A First Example: Definitions and Calls 478 Definition 478 Calls 478 Polymorphism in Python 479 A Second Example: Intersecting Sequences 480 Definition 481 Calls 481 Polymorphism Revisited 482 Local Variables 483 Chapter Summary 483 Test Your Knowledge: Quiz 483 Test Your Knowledge: Answers 484 17. Scopes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 Python Scope Basics 485 Scope Details 486 Name Resolution: The LEGB Rule 488 Scope Example 490 The Built-in Scope 491 The global Statement 494 xiv | Table of Contents Program Design: Minimize Global Variables 495 Program Design: Minimize Cross-File Changes 497 Other Ways to Access Globals 498 Scopes and Nested Functions 499 Nested Scope Details 500 Nested Scope Examples 500 Factory Functions: Closures 501 Retaining Enclosing Scope State with Defaults 504 The nonlocal Statement in 3.X 508 nonlocal Basics 508 nonlocal in Action 509 Why nonlocal? State Retention Options 512 State with nonlocal: 3.X only 512 State with Globals: A Single Copy Only 513 State with Classes: Explicit Attributes (Preview) 513 State with Function Attributes: 3.X and 2.X 515 Chapter Summary 519 Test Your Knowledge: Quiz 519 Test Your Knowledge: Answers 520 18. Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 Argument-Passing Basics 523 Arguments and Shared References 524 Avoiding Mutable Argument Changes 526 Simulating Output Parameters and Multiple Results 527 Special Argument-Matching Modes 528 Argument Matching Basics 529 Argument Matching Syntax 530 The Gritty Details 531 Keyword and Default Examples 532 Arbitrary Arguments Examples 534 Python 3.X Keyword-Only Arguments 539 The min Wakeup Call! 542 Full Credit 542 Bonus Points 544 The Punch Line... 544 Generalized Set Functions 545 Emulating the Python 3.X print Function 547 Using Keyword-Only Arguments 548 Chapter Summary 550 Test Your Knowledge: Quiz 551 Test Your Knowledge: Answers 552 Table of Contents | xv 19. Advanced Function Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 Function Design Concepts 553 Recursive Functions 555 Summation with Recursion 555 Coding Alternatives 556 Loop Statements Versus Recursion 557 Handling Arbitrary Structures 558 Function Objects: Attributes and Annotations 562 Indirect Function Calls: “First Class” Objects 562 Function Introspection 563 Function Attributes 564 Function Annotations in 3.X 565 Anonymous Functions: lambda 567 lambda Basics 568 Why Use lambda? 569 How (Not) to Obfuscate Your Python Code 571 Scopes: lambdas Can Be Nested Too 572 Functional Programming Tools 574 Mapping Functions over Iterables: map 574 Selecting Items in Iterables: filter 576 Combining Items in Iterables: reduce 576 Chapter Summary 578 Test Your Knowledge: Quiz 578 Test Your Knowledge: Answers 578 20. Comprehensions and Generations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581 List Comprehensions and Functional Tools 581 List Comprehensions Versus map 582 Adding Tests and Nested Loops: filter 583 Example: List Comprehensions and Matrixes 586 Don’t Abuse List Comprehensions: KISS 588 Generator Functions and Expressions 591 Generator Functions: yield Versus return 592 Generator Expressions: Iterables Meet Comprehensions 597 Generator Functions Versus Generator Expressions 602 Generators Are Single-Iteration Objects 604 Generation in Built-in Types, Tools, and Classes 606 Example: Generating Scrambled Sequences 609 Don’t Abuse Generators: EIBTI 614 Example: Emulating zip and map with Iteration Tools 617 Comprehension Syntax Summary 622 Scopes and Comprehension Variables 623 Comprehending Set and Dictionary Comprehensions 624 xvi | Table of Contents Extended Comprehension Syntax for Sets and Dictionaries 625 Chapter Summary 626 Test Your Knowledge: Quiz 626 Test Your Knowledge: Answers 626 21. The Benchmarking Interlude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629 Timing Iteration Alternatives 629 Timing Module: Homegrown 630 Timing Script 634 Timing Results 635 Timing Module Alternatives 638 Other Suggestions 642 Timing Iterations and Pythons with timeit 642 Basic timeit Usage 643 Benchmark Module and Script: timeit 647 Benchmark Script Results 649 More Fun with Benchmarks 651 Other Benchmarking Topics: pystones 656 Function Gotchas 656 Local Names Are Detected Statically 657 Defaults and Mutable Objects 658 Functions Without returns 660 Miscellaneous Function Gotchas 661 Chapter Summary 661 Test Your Knowledge: Quiz 662 Test Your Knowledge: Answers 662 Test Your Knowledge: Part IV Exercises 663 Part V. Modules and Packages 22. Modules: The Big Picture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669 Why Use Modules? 669 Python Program Architecture 670 How to Structure a Program 671 Imports and Attributes 671 Standard Library Modules 673 How Imports Work 674 1. Find It 674 2. Compile It (Maybe) 675 3. Run It 675 Byte Code Files: __pycache__ in Python 3.2 676 Byte Code File Models in Action 677 Table of Contents | xvii Download from Wow! eBook <www.wowebook.com> The Module Search Path 678 Configuring the Search Path 681 Search Path Variations 681 The sys.path List 681 Module File Selection 682 Chapter Summary 685 Test Your Knowledge: Quiz 685 Test Your Knowledge: Answers 685 23. Module Coding Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 Module Creation 687 Module Filenames 687 Other Kinds of Modules 688 Module Usage 688 The import Statement 689 The from Statement 689 The from * Statement 689 Imports Happen Only Once 690 import and from Are Assignments 691 import and from Equivalence 692 Potential Pitfalls of the from Statement 693 Module Namespaces 694 Files Generate Namespaces 695 Namespace Dictionaries: __dict__ 696 Attribute Name Qualification 697 Imports Versus Scopes 698 Namespace Nesting 699 Reloading Modules 700 reload Basics 701 reload Example 702 Chapter Summary 703 Test Your Knowledge: Quiz 704 Test Your Knowledge: Answers 704 24. Module Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707 Package Import Basics 708 Packages and Search Path Settings 708 Package __init__.py Files 709 Package Import Example 711 from Versus import with Packages 713 Why Use Package Imports? 713 A Tale of Three Systems 714 Package Relative Imports 717 xviii | Table of Contents Changes in Python 3.X 718 Relative Import Basics 718 Why Relative Imports? 720 The Scope of Relative Imports 722 Module Lookup Rules Summary 723 Relative Imports in Action 723 Pitfalls of Package-Relative Imports: Mixed Use 729 Python 3.3 Namespace Packages 734 Namespace Package Semantics 735 Impacts on Regular Packages: Optional __init__.py 736 Namespace Packages in Action 737 Namespace Package Nesting 738 Files Still Have Precedence over Directories 740 Chapter Summary 742 Test Your Knowledge: Quiz 742 Test Your Knowledge: Answers 742 25. Advanced Module Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 Module Design Concepts 745 Data Hiding in Modules 747 Minimizing from * Damage: _X and __all__ 747 Enabling Future Language Features: __future__ 748 Mixed Usage Modes: __name__ and __main__ 749 Unit Tests with __name__ 750 Example: Dual Mode Code 751 Currency Symbols: Unicode in Action 754 Docstrings: Module Documentation at Work 756 Changing the Module Search Path 756 The as Extension for import and from 758 Example: Modules Are Objects 759 Importing Modules by Name String 761 Running Code Strings 762 Direct Calls: Two Options 762 Example: Transitive Module Reloads 763 A Recursive Reloader 764 Alternative Codings 767 Module Gotchas 770 Module Name Clashes: Package and Package-Relative Imports 771 Statement Order Matters in Top-Level Code 771 from Copies Names but Doesn’t Link 772 from * Can Obscure the Meaning of Variables 773 reload May Not Impact from Imports 773 reload, from, and Interactive Testing 774 Table of Contents | xix Recursive from Imports May Not Work 775 Chapter Summary 776 Test Your Knowledge: Quiz 777 Test Your Knowledge: Answers 777 Test Your Knowledge: Part V Exercises 778 Part VI. Classes and OOP 26. OOP: The Big Picture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783 Why Use Classes? 784 OOP from 30,000 Feet 785 Attribute Inheritance Search 785 Classes and Instances 788 Method Calls 788 Coding Class Trees 789 Operator Overloading 791 OOP Is About Code Reuse 792 Chapter Summary 795 Test Your Knowledge: Quiz 795 Test Your Knowledge: Answers 795 27. Class Coding Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797 Classes Generate Multiple Instance Objects 797 Class Objects Provide Default Behavior 798 Instance Objects Are Concrete Items 798 A First Example 799 Classes Are Customized by Inheritance 801 A Second Example 802 Classes Are Attributes in Modules 804 Classes Can Intercept Python Operators 805 A Third Example 806 Why Use Operator Overloading? 808 The World’s Simplest Python Class 809 Records Revisited: Classes Versus Dictionaries 812 Chapter Summary 814 Test Your Knowledge: Quiz 815 Test Your Knowledge: Answers 815 28. A More Realistic Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817 Step 1: Making Instances 818 Coding Constructors 818 Testing As You Go 819 xx | Table of Contents Using Code Two Ways 820 Step 2: Adding Behavior Methods 822 Coding Methods 824 Step 3: Operator Overloading 826 Providing Print Displays 826 Step 4: Customizing Behavior by Subclassing 828 Coding Subclasses 828 Augmenting Methods: The Bad Way 829 Augmenting Methods: The Good Way 829 Polymorphism in Action 832 Inherit, Customize, and Extend 833 OOP: The Big Idea 833 Step 5: Customizing Constructors, Too 834 OOP Is Simpler Than You May Think 836 Other Ways to Combine Classes 836 Step 6: Using Introspection Tools 840 Special Class Attributes 840 A Generic Display Tool 842 Instance Versus Class Attributes 843 Name Considerations in Tool Classes 844 Our Classes’ Final Form 845 Step 7 (Final): Storing Objects in a Database 847 Pickles and Shelves 847 Storing Objects on a Shelve Database 848 Exploring Shelves Interactively 849 Updating Objects on a Shelve 851 Future Directions 853 Chapter Summary 855 Test Your Knowledge: Quiz 855 Test Your Knowledge: Answers 856 29. Class Coding Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859 The class Statement 859 General Form 860 Example 860 Methods 862 Method Example 863 Calling Superclass Constructors 864 Other Method Call Possibilities 864 Inheritance 865 Attribute Tree Construction 865 Specializing Inherited Methods 866 Class Interface Techniques 867 Table of Contents | xxi Abstract Superclasses 869 Namespaces: The Conclusion 872 Simple Names: Global Unless Assigned 872 Attribute Names: Object Namespaces 872 The “Zen” of Namespaces: Assignments Classify Names 873 Nested Classes: The LEGB Scopes Rule Revisited 875 Namespace Dictionaries: Review 878 Namespace Links: A Tree Climber 880 Documentation Strings Revisited 882 Classes Versus Modules 884 Chapter Summary 884 Test Your Knowledge: Quiz 884 Test Your Knowledge: Answers 885 30. Operator Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887 The Basics 887 Constructors and Expressions: __init__ and __sub__ 888 Common Operator Overloading Methods 888 Indexing and Slicing: __getitem__ and __setitem__ 890 Intercepting Slices 891 Slicing and Indexing in Python 2.X 893 But 3.X’s __index__ Is Not Indexing! 894 Index Iteration: __getitem__ 894 Iterable Objects: __iter__ and __next__ 895 User-Defined Iterables 896 Multiple Iterators on One Object 899 Coding Alternative: __iter__ plus yield 902 Membership: __contains__, __iter__, and __getitem__ 906 Attribute Access: __getattr__ and __setattr__ 909 Attribute Reference 909 Attribute Assignment and Deletion 910 Other Attribute Management Tools 912 Emulating Privacy for Instance Attributes: Part 1 912 String Representation: __repr__ and __str__ 913 Why Two Display Methods? 914 Display Usage Notes 916 Right-Side and In-Place Uses: __radd__ and __iadd__ 917 Right-Side Addition 917 In-Place Addition 920 Call Expressions: __call__ 921 Function Interfaces and Callback-Based Code 923 Comparisons: __lt__, __gt__, and Others 925 The __cmp__ Method in Python 2.X 926 xxii | Table of Contents Boolean Tests: __bool__ and __len__ 927 Boolean Methods in Python 2.X 928 Object Destruction: __del__ 929 Destructor Usage Notes 930 Chapter Summary 931 Test Your Knowledge: Quiz 931 Test Your Knowledge: Answers 931 31. Designing with Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933 Python and OOP 933 Polymorphism Means Interfaces, Not Call Signatures 934 OOP and Inheritance: “Is-a” Relationships 935 OOP and Composition: “Has-a” Relationships 937 Stream Processors Revisited 938 OOP and Delegation: “Wrapper” Proxy Objects 942 Pseudoprivate Class Attributes 944 Name Mangling Overview 945 Why Use Pseudoprivate Attributes? 945 Methods Are Objects: Bound or Unbound 948 Unbound Methods Are Functions in 3.X 950 Bound Methods and Other Callable Objects 951 Classes Are Objects: Generic Object Factories 954 Why Factories? 955 Multiple Inheritance: “Mix-in” Classes 956 Coding Mix-in Display Classes 957 Other Design-Related Topics 977 Chapter Summary 977 Test Your Knowledge: Quiz 978 Test Your Knowledge: Answers 978 32. Advanced Class Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 979 Extending Built-in Types 980 Extending Types by Embedding 980 Extending Types by Subclassing 981 The “New Style” Class Model 983 Just How New Is New-Style? 984 New-Style Class Changes 985 Attribute Fetch for Built-ins Skips Instances 987 Type Model Changes 992 All Classes Derive from “object” 995 Diamond Inheritance Change 997 More on the MRO: Method Resolution Order 1001 Example: Mapping Attributes to Inheritance Sources 1004 Table of Contents | xxiii New-Style Class Extensions 1010 Slots: Attribute Declarations 1010 Properties: Attribute Accessors 1020 __getattribute__ and Descriptors: Attribute Tools 1023 Other Class Changes and Extensions 1023 Static and Class Methods 1024 Why the Special Methods? 1024 Static Methods in 2.X and 3.X 1025 Static Method Alternatives 1027 Using Static and Class Methods 1028 Counting Instances with Static Methods 1030 Counting Instances with Class Methods 1031 Decorators and Metaclasses: Part 1 1034 Function Decorator Basics 1035 A First Look at User-Defined Function Decorators 1037 A First Look at Class Decorators and Metaclasses 1038 For More Details 1040 The super Built-in Function: For Better or Worse? 1041 The Great super Debate 1041 Traditional Superclass Call Form: Portable, General 1042 Basic super Usage and Its Tradeoffs 1043 The super Upsides: Tree Changes and Dispatch 1049 Runtime Class Changes and super 1049 Cooperative Multiple Inheritance Method Dispatch 1050 The super Summary 1062 Class Gotchas 1064 Changing Class Attributes Can Have Side Effects 1064 Changing Mutable Class Attributes Can Have Side Effects, Too 1065 Multiple Inheritance: Order Matters 1066 Scopes in Methods and Classes 1068 Miscellaneous Class Gotchas 1069 KISS Revisited: “Overwrapping-itis” 1070 Chapter Summary 1070 Test Your Knowledge: Quiz 1071 Test Your Knowledge: Answers 1071 Test Your Knowledge: Part VI Exercises 1072 Part VII. Exceptions and Tools 33. Exception Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1081 Why Use Exceptions? 1081 Exception Roles 1082 xxiv | Table of Contents Exceptions: The Short Story 1083 Default Exception Handler 1083 Catching Exceptions 1084 Raising Exceptions 1085 User-Defined Exceptions 1086 Termination Actions 1087 Chapter Summary 1089 Test Your Knowledge: Quiz 1090 Test Your Knowledge: Answers 1090 34. Exception Coding Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093 The try/except/else Statement 1093 How try Statements Work 1094 try Statement Clauses 1095 The try else Clause 1098 Example: Default Behavior 1098 Example: Catching Built-in Exceptions 1100 The try/finally Statement 1100 Example: Coding Termination Actions with try/finally 1101 Unified try/except/finally 1102 Unified try Statement Syntax 1104 Combining finally and except by Nesting 1104 Unified try Example 1105 The raise Statement 1106 Raising Exceptions 1107 Scopes and try except Variables 1108 Propagating Exceptions with raise 1110 Python 3.X Exception Chaining: raise from 1110 The assert Statement 1112 Example: Trapping Constraints (but Not Errors!) 1113 with/as Context Managers 1114 Basic Usage 1114 The Context Management Protocol 1116 Multiple Context Managers in 3.1, 2.7, and Later 1118 Chapter Summary 1119 Test Your Knowledge: Quiz 1120 Test Your Knowledge: Answers 1120 35. Exception Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1123 Exceptions: Back to the Future 1124 String Exceptions Are Right Out! 1124 Class-Based Exceptions 1125 Coding Exceptions Classes 1126 Table of Contents | xxv Why Exception Hierarchies? 1128 Built-in Exception Classes 1131 Built-in Exception Categories 1132 Default Printing and State 1133 Custom Print Displays 1135 Custom Data and Behavior 1136 Providing Exception Details 1136 Providing Exception Methods 1137 Chapter Summary 1139 Test Your Knowledge: Quiz 1139 Test Your Knowledge: Answers 1139 36. Designing with Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141 Nesting Exception Handlers 1141 Example: Control-Flow Nesting 1143 Example: Syntactic Nesting 1143 Exception Idioms 1145 Breaking Out of Multiple Nested Loops: “go to” 1145 Exceptions Aren’t Always Errors 1146 Functions Can Signal Conditions with raise 1147 Closing Files and Server Connections 1148 Debugging with Outer try Statements 1149 Running In-Process Tests 1149 More on sys.exc_info 1150 Displaying Errors and Tracebacks 1151 Exception Design Tips and Gotchas 1152 What Should Be Wrapped 1152 Catching Too Much: Avoid Empty except and Exception 1153 Catching Too Little: Use Class-Based Categories 1155 Core Language Summary 1155 The Python Toolset 1156 Development Tools for Larger Projects 1157 Chapter Summary 1160 Test Your Knowledge: Quiz 1161 Test Your Knowledge: Answers 1161 Test Your Knowledge: Part VII Exercises 1161 Part VIII. Advanced Topics 37. Unicode and Byte Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1165 String Changes in 3.X 1166 String Basics 1167 xxvi | Table of Contents Character Encoding Schemes 1167 How Python Stores Strings in Memory 1170 Python’s String Types 1171 Text and Binary Files 1173 Coding Basic Strings 1174 Python 3.X String Literals 1175 Python 2.X String Literals 1176 String Type Conversions 1177 Coding Unicode Strings 1178 Coding ASCII Text 1178 Coding Non-ASCII Text 1179 Encoding and Decoding Non-ASCII text 1180 Other Encoding Schemes 1181 Byte String Literals: Encoded Text 1183 Converting Encodings 1184 Coding Unicode Strings in Python 2.X 1185 Source File Character Set Encoding Declarations 1187 Using 3.X bytes Objects 1189 Method Calls 1189 Sequence Operations 1190 Other Ways to Make bytes Objects 1191 Mixing String Types 1192 Using 3.X/2.6 bytearray Objects 1192 bytearrays in Action 1193 Python 3.X String Types Summary 1195 Using Text and Binary Files 1195 Text File Basics 1196 Text and Binary Modes in 2.X and 3.X 1197 Type and Content Mismatches in 3.X 1198 Using Unicode Files 1199 Reading and Writing Unicode in 3.X 1199 Handling the BOM in 3.X 1201 Unicode Files in 2.X 1204 Unicode Filenames and Streams 1205 Other String Tool Changes in 3.X 1206 The re Pattern-Matching Module 1206 The struct Binary Data Module 1207 The pickle Object Serialization Module 1209 XML Parsing Tools 1211 Chapter Summary 1215 Test Your Knowledge: Quiz 1215 Test Your Knowledge: Answers 1216 Table of Contents | xxvii 38. Managed Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1219 Why Manage Attributes? 1219 Inserting Code to Run on Attribute Access 1220 Properties 1221 The Basics 1222 A First Example 1222 Computed Attributes 1224 Coding Properties with Decorators 1224 Descriptors 1226 The Basics 1227 A First Example 1229 Computed Attributes 1231 Using State Information in Descriptors 1232 How Properties and Descriptors Relate 1236 __getattr__ and __getattribute__ 1237 The Basics 1238 A First Example 1241 Computed Attributes 1243 __getattr__ and __getattribute__ Compared 1245 Management Techniques Compared 1246 Intercepting Built-in Operation Attributes 1249 Example: Attribute Validations 1256 Using Properties to Validate 1256 Using Descriptors to Validate 1259 Using __getattr__ to Validate 1263 Using __getattribute__ to Validate 1265 Chapter Summary 1266 Test Your Knowledge: Quiz 1266 Test Your Knowledge: Answers 1267 39. Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269 What’s a Decorator? 1269 Managing Calls and Instances 1270 Managing Functions and Classes 1270 Using and Defining Decorators 1271 Why Decorators? 1271 The Basics 1273 Function Decorators 1273 Class Decorators 1277 Decorator Nesting 1279 Decorator Arguments 1281 Decorators Manage Functions and Classes, Too 1282 Coding Function Decorators 1283 xxviii | Table of Contents Tracing Calls 1283 Decorator State Retention Options 1285 Class Blunders I: Decorating Methods 1289 Timing Calls 1295 Adding Decorator Arguments 1298 Coding Class Decorators 1301 Singleton Classes 1301 Tracing Object Interfaces 1303 Class Blunders II: Retaining Multiple Instances 1308 Decorators Versus Manager Functions 1309 Why Decorators? (Revisited) 1310 Managing Functions and Classes Directly 1312 Example: “Private” and “Public” Attributes 1314 Implementing Private Attributes 1314 Implementation Details I 1317 Generalizing for Public Declarations, Too 1318 Implementation Details II 1320 Open Issues 1321 Python Isn’t About Control 1329 Example: Validating Function Arguments 1330 The Goal 1330 A Basic Range-Testing Decorator for Positional Arguments 1331 Generalizing for Keywords and Defaults, Too 1333 Implementation Details 1336 Open Issues 1338 Decorator Arguments Versus Function Annotations 1340 Other Applications: Type Testing (If You Insist!) 1342 Chapter Summary 1343 Test Your Knowledge: Quiz 1344 Test Your Knowledge: Answers 1345 40. Metaclasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355 To Metaclass or Not to Metaclass 1356 Increasing Levels of “Magic” 1357 A Language of Hooks 1358 The Downside of “Helper” Functions 1359 Metaclasses Versus Class Decorators: Round 1 1361 The Metaclass Model 1364 Classes Are Instances of type 1364 Metaclasses Are Subclasses of Type 1366 Class Statement Protocol 1367 Declaring Metaclasses 1368 Declaration in 3.X 1369 Table of Contents | xxix Declaration in 2.X 1369 Metaclass Dispatch in Both 3.X and 2.X 1370 Coding Metaclasses 1370 A Basic Metaclass 1371 Customizing Construction and Initialization 1372 Other Metaclass Coding Techniques 1373 Inheritance and Instance 1378 Metaclass Versus Superclass 1381 Inheritance: The Full Story 1382 Metaclass Methods 1388 Metaclass Methods Versus Class Methods 1389 Operator Overloading in Metaclass Methods 1390 Example: Adding Methods to Classes 1391 Manual Augmentation 1391 Metaclass-Based Augmentation 1393 Metaclasses Versus Class Decorators: Round 2 1394 Example: Applying Decorators to Methods 1400 Tracing with Decoration Manually 1400 Tracing with Metaclasses and Decorators 1401 Applying Any Decorator to Methods 1403 Metaclasses Versus Class Decorators: Round 3 (and Last) 1404 Chapter Summary 1407 Test Your Knowledge: Quiz 1407 Test Your Knowledge: Answers 1408 41. All Good Things . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1409 The Python Paradox 1409 On “Optional” Language Features 1410 Against Disquieting Improvements 1411 Complexity Versus Power 1412 Simplicity Versus Elitism 1412 Closing Thoughts 1413 Where to Go From Here 1414 Encore: Print Your Own Completion Certificate! 1414 Part IX. Appendixes A. Installation and Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1421 Installing the Python Interpreter 1421 Is Python Already Present? 1421 Where to Get Python 1422 Installation Steps 1423 xxx | Table of Contents Configuring Python 1427 Python Environment Variables 1427 How to Set Configuration Options 1429 Python Command-Line Arguments 1432 Python 3.3 Windows Launcher Command Lines 1435 For More Help 1436 B. The Python 3.3 Windows Launcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1437 The Unix Legacy 1437 The Windows Legacy 1438 Introducing the New Windows Launcher 1439 A Windows Launcher Tutorial 1441 Step 1: Using Version Directives in Files 1441 Step 2: Using Command-Line Version Switches 1444 Step 3: Using and Changing Defaults 1445 Pitfalls of the New Windows Launcher 1447 Pitfall 1: Unrecognized Unix !# Lines Fail 1447 Pitfall 2: The Launcher Defaults to 2.X 1448 Pitfall 3: The New PATH Extension Option 1449 Conclusions: A Net Win for Windows 1450 C. Python Changes and This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1451 Major 2.X/3.X Differences 1451 3.X Differences 1452 3.X-Only Extensions 1453 General Remarks: 3.X Changes 1454 Changes in Libraries and Tools 1454 Migrating to 3.X 1455 Fifth Edition Python Changes: 2.7, 3.2, 3.3 1456 Changes in Python 2.7 1456 Changes in Python 3.3 1457 Changes in Python 3.2 1458 Fourth Edition Python Changes: 2.6, 3.0, 3.1 1458 Changes in Python 3.1 1458 Changes in Python 3.0 and 2.6 1459 Specific Language Removals in 3.0 1460 Third Edition Python Changes: 2.3, 2.4, 2.5 1462 Earlier and Later Python Changes 1463 D. Solutions to End-of-Part Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1465 Part I, Getting Started 1465 Part II, Types and Operations 1467 Part III, Statements and Syntax 1473 Table of Contents | xxxi Part IV, Functions and Generators 1475 Part V, Modules and Packages 1485 Part VI, Classes and OOP 1489 Part VII, Exceptions and Tools 1497 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1507 |
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论