Verfasst: Donnerstag 9. November 2006, 18:19
Na ja, will ja nicht so direkt fragen ... aber hast Du Dir mal die anderen Posts angeschaut?cyp++ hat geschrieben: gibts noch verbesserungsvorschläge?
Gruß,
Christian
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Na ja, will ja nicht so direkt fragen ... aber hast Du Dir mal die anderen Posts angeschaut?cyp++ hat geschrieben: gibts noch verbesserungsvorschläge?
Ja ^^cyp++ hat geschrieben:[...]
gibts noch verbesserungsvorschläge?
Code: Alles auswählen
def is_palindrom(s):
s = [c.lower() for c in s if c.isalpha()]
return s == s[::-1] and len(s) != 0
# Test
print is_palindrom("9%$")
print is_palindrom("otto")
Code: Alles auswählen
def is_palindrom(s):
if not s:
return True
s = [c.lower() for c in s if c.isalpha()]
return s and s == s[::-1]
vll weißt du es nicht, aber ich bin anfänger 11. klasse ausbildung zum tai. das hatten wir noch alles gar nicht!CM hat geschrieben:Na ja, will ja nicht so direkt fragen ... aber hast Du Dir mal die anderen Posts angeschaut?cyp++ hat geschrieben: gibts noch verbesserungsvorschläge?
Gruß,
Christian
OK, aber nicht im sinne von einem Wort/Begriff. Otto ist ein Palindrom aber ein Leerzeichen ist einfach nichts und mMn wäre es verkehrt dann ein True zurückzugeben. Aber in weitesten Sinne magst du wohl rech haben, wie auch CM mit seinen Code.BlackJack hat geschrieben:Hm ich würde das noch ein klein wenig ändern, IMHO erfüllt eine leere Zeichenkette auch die Palindrom-Eigenschaft:
Code: Alles auswählen
def is_palindrom(s): if not s: return True s = [c.lower() for c in s if c.isalpha()] return s and s == s[::-1]
Code: Alles auswählen
k=k.lower()
if k == k[::-1]:
print "Ist ein Palindrom"
else:
print "Ist kein Palindrom"
Und das heißt, dass deine Programme nur das können dürfen, was ihr im Unterricht durchgekaut habt und du dich nicht anderorts informieren kannst?cyp++ hat geschrieben:vll weißt du es nicht, aber ich bin anfänger 11. klasse ausbildung zum tai. das hatten wir noch alles gar nicht!
Ich hab's im engsten Sinne als Informatiker betrachtet und da fängt die induktive Definition eines Palindroms mit dem leeren Wort (ε) an. Das ist nämlich ein beliebtes Beispiel für eine Sprache die nicht von regulären Ausdrücken und deterministischen Kellerautomaten erkannt werden kann.XtraNine hat geschrieben:OK, aber nicht im sinne von einem Wort/Begriff. Otto ist ein Palindrom aber ein Leerzeichen ist einfach nichts und mMn wäre es verkehrt dann ein True zurückzugeben. Aber in weitesten Sinne magst du wohl rech haben, wie auch CM mit seinen Code.
Code: Alles auswählen
def is_palindrom(s):
if not s:
return True
s = [c.lower() for c in s if c.isalpha()]
return s and s == s[::-1]
Ich denke nicht das er das Böse gemeint hat. Sondern wollte nur darauf hinweisen, das einige auf dein Post eingegangen sind und du dir dann auch die mühe machen solltest, die posts wenigstens zu lesen. Du hast ja schließlich nach Hilfe gefragt und dann, nach dem alle ein par vorschlage geschrieben haben, nach Verbesserungen zu fragen, ist da schon ein wenig Strange Es wurden ja viel sehr kurze und gute Sachen gepostet (ausgenommen von meiner re Variante die echt schlecht ist ^^ Aber das ist ein anderes Thema)cyp++ hat geschrieben:[…]
vll weißt du es nicht, aber ich bin anfänger 11. klasse ausbildung zum tai. das hatten wir noch alles gar nicht!
Code: Alles auswählen
string ="Hello World"
for i in string:
print I,
Code: Alles auswählen
Hello World
…ist nicht böse gemeint, aber dein Code ist zu lang und zu komplex und total unpythonisch.XtraNine hat geschrieben: Dabei fällt mir die regel 1 vom Zen ein: Schön ist besser als hässlich.
und die regel 3: Einfach ist besser als komplex.
Danke für die Information. Ich werde mich diesbezüglich mit beschäftigen. Ich komme leider nicht aus der Informatik und wusste das daher nicht.BlackJack hat geschrieben:Ich hab's im engsten Sinne als Informatiker betrachtet und da fängt die induktive Definition eines Palindroms mit dem leeren Wort (ε) an. Das ist nämlich ein beliebtes Beispiel für eine Sprache die nicht von regulären Ausdrücken und deterministischen Kellerautomaten erkannt werden kann.XtraNine hat geschrieben:OK, aber nicht im sinne von einem Wort/Begriff. Otto ist ein Palindrom aber ein Leerzeichen ist einfach nichts und mMn wäre es verkehrt dann ein True zurückzugeben. Aber in weitesten Sinne magst du wohl rech haben, wie auch CM mit seinen Code.
Dann kannst du ja Fragen. Ist ja kein Beinbruch.cyp++ hat geschrieben:ja, hast schon recht mit. aber wie soll ich das verstehen wenn ich nicht weiß was die einzelnen sachen bedeuten?
Def bedeutet, dass danach ein Funktionsname folgt. is_palindrom ist der Name dieser Funktion. Return gibt den dahiner stehenden Wert zurück, es gibt sie an die Stelle zurück von der sich aufgerufen wurde:cyp++ hat geschrieben:was ist def? was is_palindrom()? was macht return ( zurückkehren? zu was? ) zeile 4 u. 5 versteh ich eig gar nicht.
Code: Alles auswählen
ein_palindrom = is_palindrom("otto")
# wird nach dem Aufruf der Funktion zu
ein_palindrom = True
Hm, das fällt mir teilweise gar nicht mehr auf, aber es sieht wirklich ein bisschen funktional aus. Zum Vergleich in Haskell:XtraNine hat geschrieben:Ich verstehe da einige Sachen auch noch nicht wie zum beispiel BlackJacks Funktionales Beispiel
Code: Alles auswählen
import Char ( isAlpha, toLower )
isPalindrome "" = True
isPalindrome xs = let xs' = [toLower x | x <- xs, isAlpha x]
in (length xs' > 0) && (xs' == reverse xs')
main = print (isPalindrome "Satan, oscillate my metallic sonatas!")
Code: Alles auswählen
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int is_palindrome(char *str)
{
char *start = str;
char *end = start + strlen(str);
if (start == end) {
return 1;
}
while (1) {
while (start < end && ! isalpha(*start)) {
++start;
}
while (start < end && ! isalpha(*end)) {
--end;
}
if (tolower(*start) != tolower(*end)) {
return 0;
}
if (start >= end) {
return isalpha(*start);
}
++start;
--end;
}
}
Code: Alles auswählen
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "BJ.h"
/* strrev ist semi-standard,
jedoch nicht standardmaessig bei gcc */
char *strrev(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
/*Black Jacks enge Definition*/
int blackjack2C(char *str){
char *str2 = str + strlen(str) -1;
if ( !*str ) return 1;
while( *str++ == *str2-- && *str);
return !*str && *(--str) == *(++str2);
}
/*meine lieblingsvariante - trotz "Kopierverbot"*/
int is_palindrome2(char *str){
char tmp[strlen(str)];
strcpy(tmp, str);
strrev(tmp);
if (strlen(str) <= 1) return 0;
if (strcmp(str, tmp) == 0)
return 1;
else
return 0;
}
int main(){
char* const s = "Satan, oscillate my metallic sonatas!";
char* const s2 = "anna";
char* const opp = "kein palindrom";
printf ("testing is_palindrome:\n");
printf ("'Satan, oscillate my metallic sonatas!' is a palindrome : %s\n", is_palindrome(s) ? "yes": "no" );
printf ("'anna' is a palindrome : %s\n", is_palindrome(s2) ? "yes": "no" );
printf ("'kein palindorm' is a palindrome : %s\n", is_palindrome(opp) ? "yes": "no" );
printf("\n\ntesting blackjack2C:\n");
printf ("'Satan, oscillate my metallic sonatas!' is a palindrome : %s\n", blackjack2C(s) ? "yes": "no" );
printf ("'anna' is a palindrome : %s\n", blackjack2C(s2) ? "yes": "no" );
printf ("'kein palindrom' is a palindrome : %s\n", blackjack2C(opp) ? "yes": "no" );
printf("\n\ntesting cm lieblingsversion:\n");
printf ("'Satan, oscillate my metallic sonatas!' is a palindrome : %s\n", is_palindrome2(s) ? "yes": "no" );
printf ("'anna' is a palindrome : %s\n", is_palindrome2(s2) ? "yes": "no" );
printf ("'kein palindrom' is a palindrome : %s\n", is_palindrome2(opp) ? "yes": "no" );
}
^^ Neine natürlich nicht Jack und darum geht es ja nicht Es gibt ein par Situationen, da würde ich mir die pre- und postfix variante wünschen.BlackJack hat geschrieben:Ist ``x += 1`` zu viel Tipparbeit?
[...]
Code: Alles auswählen
table = ["spam1", "spam2", "spam3"]
cntr = 0
ntable = []
for string in table:
ntable.append([cntr, string])
cntr += 1
Code: Alles auswählen
for string in table:
ntable.append([cntr++, string])
Ich glaub an dieser Stelle gibt es kaum ein Sinnvolles Beispiel denn wie du selbst feststellst - selbst für diesen Fall bietet Python mit enumerate() etwas besseres an.XtraNine hat geschrieben:(Ich weiß das Beispiel ist schlecht und in Wirklichkeit würde ich enumerate benutzen, aber wie gesagt ist nur ein Beispiel )
Code: Alles auswählen
table = ['spam1', 'spam2', 'spam3']
new_table = map(list, enumerate(table))